1.htaccess co to jest
Plik .htaccess jest domyślnym plikiem, za pomocą, którego można zmieniać ustawienia serwera Apatche. Nie musi się on tak koniecznie nazywać. Administrator serwera ma prawo ustawić taką nazwę jaką chce np. .settings
. Zwyczajowo jednak jego nazwa brzmi .htaccess
, co bardzo ułatwia innym developerom pracę - nie muszą szukać jak nazwać plik, w którym mogą dodać dyrektywy i odpowiednio ustawić i zabezpieczyć serwer.
2.Co wykonamy za pomocą .htacess’a
W pliku .htaccess
podawane są dodatkowe ustawienia serwera, które obowiązują, poczynając od folderu, a co za tym idzie adresu, w którym się znajduje i działa na wszystkie podkatalogi i “podlinki”.
Ustawienia te w głównej mierze będą dotyczyć przekierowań adresów url na tzw. SEO friendly, czyli przyjazne dla robotów wyszukujących i użytkowników. Będą tam też określone zasady dostępu do pliku/ów, katalogów, opcje wyświetlania w oknie przeglądarki zawartości serwera i inne.
3.Uprawnienia do pliku
Plik .htaccess powinien mieć ustawienia uprawnień tzw. chmod na 644, co umożliwia jego edycję jedynie po połączeniu się protokołem FTP / SFTP / SSH - czyli nikt nie zmieni jego zawartości z poziomu przeglądarki.
Komentarze w htaccess oznaczane są hashem #. Kolejność zapisywanych dyrektyw ma znaczenie, wykonywane są one od góry do dołu. Czasem się zdarzy, że zapisane w pliku .htaccess
dyrektywy zapętlą nasz serwer, trzeba więc na to uważać. Każdy błąd w .htaccess (choć nie tylko) wyświetla w przeglądarce kod błędu nr 500 - Internal Server Error.
Poniżej zamieszczam najczęściej wykorzystywane reguły .htaccess - przepisywanie url i podstawowe ustawienia, w kolejności od najbardziej przydatnych do najmniej :)
5.Flagi przekierowań i reguł stosowane poniżej:
[R] - Redirect [R=kod] - Redirect z kodem np. 301 /Moved Permanently/ - przekieruj link według podanej wartości
[L] Last rule – oznacza, że ta linijka jest ostatnią linijką przekierowania i dalsze nie będą wykonywane do czasu podania nowego warunku przekierowania
[NC] No case – ignoruje fakt, czy adres jest pisany wielkimi, czy małymi literami
[QSA] Euery string append – powoduje dodanie na końcu całego zapytania query string
Rzadziej wykorzystywane:
[F] Force URL to be forbidden – zwraca błąd 403
[S=liczba] Skip next rule(s) – pomija zapisaną liczbę reguł
[N] next round – przetwarzanie od początku
[T = MIME type] Force MIME type – ustawienie typu MIME
6.REWRITE URL
Do przepisania adresów poprzez .htaccess musi być aktywny mod_rewrite na serwerze. Czy jest on aktywny można sprawdzić poprzez echo php_info()
. W sekcji pliku konfiguracyjnego PHP można sprawdzić czy moduł znajduje się na liście. Jego obecność z dużym prawdopodobieństwem oznacza, że moduł działa. Aby uniknąć komunikatów o błędzie serwera z tytułu nie działającego mod_rewrite, warto nasze dyrektywy zawierać w znacznik <IfModule mod_rewrite.c>...</IfModule>
mod_rewrite
uruchamiamy poprzez wpisanie, splaszając dyrektywę - uruchom silnik przepisywania i podążaj za dowiązaniami symbolicznymi -> (upraszczając dowiązaniem symbolicznym nazywa się skrót do pliku, który traktowany jest jako plik fizyczny - często stosowane w unixowych systemach plików).
1
2
| RewriteEngine On
Options +FollowSymLinks
|
Niektóre serwery wymagają do działania modułu rewrite podania RewriteBase /
Przy specyficznych ustawieniach serwera jest to pełna ścieżka do katalogu w drzewie katalogów naszego serwera.
6.1.Przekierowanie zewnętrznych url’i zawierających query string na ten sam adres // SEO
1
2
3
| RewriteCond %{THE_REQUEST} ^[A-Z]+ /.*\ HTTP
RewriteCond %{QUERY_STRING} !^$
RewriteRule .* https://www.domena.com%{REQUEST_URI}? [R=301, L]
|
6.2.Ustawienie wersji językowej w zależności od ustawień przeglądarki poprzez env
1
2
| RewriteCond %{HTTP:Accept-Language} ^.*(de|es|fr|it|ja|ru|en).*$ [NC]
RewriteRule ^(.*)$ - [env=prefer-language:%1]
|
lub
Przekierowanie na odpowiedni link lub katalog
1
2
| RewriteCond %{HTTP:Accept-Language} ^pl [NC]
RewriteRule ^$ /pl/? [L,R=301]
|
6.3.Dostęp zabroniony, prócz fopen()
PHP
1
2
3
4
| RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^.+$ [NC]
RewriteRule .* - [F,L]
|
6.4.Przepisanie podkreślników “_” na myślniki “-“// SEO
1
2
3
4
5
6
7
8
9
10
11
12
| Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule !\.(html|php)$ - [S=4]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5 [E=uscor:Yes]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4 [E=uscor:Yes]
RewriteRule ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3 [E=uscor:Yes]
RewriteRule ^([^_]*)_(.*)$ $1-$2 [E=uscor:Yes]
RewriteCond %{ENV:uscor} ^Yes$
RewriteRule (.*) http://d.com/$1 [R=301,L]
|
6.5.Pozwól tylko na określone metody połączenia np GET i PUT
1
2
| RewriteCond %{REQUEST_METHOD} !^(GET|PUT)
RewriteRule .* - [F]
|
6.6.Przekierowanie http na https i z www na bez www
1
2
3
4
5
6
| RewriteCond %{HTTPS} off
# RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
|
6.7.Usunięcie rozszerzenia pliku z url’a
1
2
3
4
5
6
7
8
| RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[^/])$ $1.html
```htaccess
## 6.8.Usunięcie ukośnika z url'a
```apache
RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1
|
6.9.Blokada dostępu do .htaccess
1
2
3
4
5
| <files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</files>
|
Blokada dostępu do określonego pliku np do wp-config.php
1
2
3
4
| <files wp-config.php>
order allow,deny
deny from all
</files>
|
Blokada dostępu do pliku XMLRPC
Plik ten służy do publikowania treści w Wordpresie za pomocą API i zewnętrznych programów.
1
2
3
4
| <files xmlrpc.php>
order deny,allow
deny from all
</files>
|
Zwiększenie limitu pamięci php
1
| php_value memory_limit 128M
|
Ustawienie maksymalnej wielkości wysyłanych plików
1
| php_value upload_max_filesize 128M
|
Przekierowanie 301 starych stron na nowe
1
2
3
|
# 7.zwykłe przekierowanie
Redirect 301 /stara-podstrona /nowa-podstrona
|
Ukrywanie listowania plików w folderze
Ustawianie strony błędów
1
2
| ErrorDocument 403 /403.html
ErrorDocument 500 /500.html
|
Blokowanie adresów IP
1
2
3
4
| Order Allow,Deny
Allow from all
Deny from 12.148.209.196
Deny from 87.207.112.205
|
Kolejność sprawdzania pliku głównego - przydatne przy ustawianiu np. strony maintance
DirectoryIndex index.html index.php error.html
Zmiana sposobu wyświetlania przez serwer pliku np. wyświetlaj txt jako html
Wskaż jakie dokumenty mają być od razu pobierane a nie wyświetlane w przeglądarce
1
| AddType application/octet-stream .pdf .gz
|
Przekierowanie subdomeny na katalog
1
2
3
| RewriteCond %{HTTP_HOST} sub.domena.pl
RewriteCond %{REQUEST_URI} !sub/
RewriteRule (.*) sub/ [L]
|
lub - dla wielu adresów, by nie powielać zmieniając jedynie jeden parametr (wykorzystanie wyrażeń regularnych)
1
2
3
4
5
| RewriteCond %{HTTP_HOST} strona.pl [NC]
# 8.bez pustego znaku
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule .* http://%1.strona.pl [L]
|