Htacces - najbardziej przydatne dyrektywy przepisywania i ustawienia

Jozdowska Edyta · 03 Grudzień 2019

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.

4.Inne przydatne informacje

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

1
Options All -Indexes

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

1
AddType text/html .txt

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]

Jozdowska Edyta * FullStack Developer

Pisanie kodu jest moją pasją. Zajmuję się tym od przeszło 10 lat, z większą lub mniejszą intensywnością.
Piszę kod w PHP, JS, SCSS i Python. Nie stronię też od poznawania nowych, lub jak kto woli starych rozwiązań jak Jekyll oraz innych języków np. Java.

więcej o mnie