.htaccess – jest plikiem konfiguracyjny serwera WWW Apache, który pozwala zarządzać działaniem i przetwarzaniem zapytań do strony z poziomu serwera WWW. Pozwala na dodatkowe ustawienia strony za pomocą różnych parametrów (dyrektyw) bez zmiany głównego pliku konfiguracyjnego serwera www.
Przekierowania oraz ustawienia pliku .htaccess działają dla folderu, w którym znajdują się i dla wszystkich folderów wewnątrz. Jeśli chcemy przy pomocy .htaccess zmienić ustawienia dla witryny – musimy go utworzyć w folderze głównym witryny ~/public_html/.
Należy zachować ostrożność podczas edycji pliku .htaccess. Podczas zapisywania zmian w takim pliku w kodowaniu UTF-8 nie powinien on zawierać sygnatur BOM. Do edycji pliku .htaccess i innych plików konfiguracyjnych zalecamy używać Notepad++.
Plik .htaccess: jak utworzyć i jego składnia
Pliki konfiguracyjne standardowo są zwykłymi plikami tekstowymi i utworzyć .htaccess można przy pomocy edytora tekstowego (takiego jak Notatnik lub NotePad++ w Windows).
Dla serwera www Apache wielkości liter ma znaczenie, dlatego nazwa musi być małymi literami: .HTaccess i .htaccess są różnymi plikami.
W systemie Mac OS pliki zaczynające się od kropki są niewidoczne. Dlatego możemy nazwać to inaczej, a następnie, przenosząc poprzez FTP na hosting, zmienić nazwę.
Składnia .htaccess jest podobna do składni httpd.conf. Każdą regułę piszemy w oddzielnym wierszu. Dla wygody można dodawać komentarze do pliku za pomocą znaku #, a wartość po # zostanie zignorowana przez serwer www. Takiego komentowania możemy użyć do wyłączenia dowolnej reguły. Nie trzeba całkowicie usuwać z pliku – wystarczy zakomentować.
Co można zrobić przy pomocy tego pliku:
Przekierowanie z http na https w .htacess
Przekierowanie zapytań na https://domena.pl:
RewriteEngine on
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Przekierowanie zapytań na http://domena.pl:
RewriteEngine on
RewriteCond %{ENV:HTTPS} on
RewriteRule ^.*$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Zarządzanie dostępem do strony
Blokada dostępu do strony:
Order Deny,Allow Deny from all
Blokada dostępu do strony, oprócz wejść z adresów IP:
order deny,allow deny from all allow from xxx.xxx.xxx.xxx
Blokada dostępu do strony dla wybranych adresów IP:
Order allow,deny Allow from all Deny from xxx.xxx.xxx.xxx
Blokada dostępu do pliku:
<Files prywatny.html > Order allow,deny Deny from all
Zabezpieczenie folderu przy pomocy hasła:
AuthType Basic AuthName "Nazwa Folderu" AuthUserFile /home/uzytkownik/.htpasswds/public_html/smth/passwd require valid-user # "Nazwa Folderu" — nazwa folderu, który trzeba zabezpieczyć # /home/uzytkownik/.htpasswds/public_html/smth/passwd — ścieżka do pliku passwd z listą loginów i haseł. # W pliku lista musi być zapisana w postaci: login:haslo
Obsługa błędów serwera www
Przy pomocy pliku .htaccess możemy ustawić własne strony do obsługi błędów aplikacji/strony:
#401 Logowanie się nie powiodło
ErrorDocument 401 https://domena.pl/errors/401.html
#403 Brak dostępu
ErrorDocument 403 https://domena.pl/errors/403.html
#404 Strona nie znaleziona
ErrorDocument 404 https://domena.pl/errors/404.html
#500 Błąd serwera
ErrorDocument 500 https://domena.pl/errors/500.html
Powyższe pliki ze stronami błędów (401.html, 404.html itd.) należy utworzyć w folderze ~/domena.pl/errors.
Aby takie strony nie zostały dodane do indeksu w Google polecamy dodać odpowiednie polecenia dla wyszukiwarek:
a) w pliku ~/domena.pl/robots.txt dodać:
User-agent: *
Disallow: /errors
O pliku robots.txt, jak nim zarządzać oraz co musi zawierać napisaliśmy w tym artykule, polecamy również go przeglądnąć.
b) utworzyć plik ~/domena.pl/errors/.htaccess, z regułą:
Options -Indexes
Na hostingach z cPanel (Hosting SSD) możemy poprzez panel administracyjny cPanel -> Własne strony błędów – utworzyć odpowiednie strony dla naszego konta lub strony www.
Konfiguracja przekierowania 301 w .htaccess
Aby na stałe przekierować witrynę na nową domenę używamy przekierowania 301 (do przekierowania na jakiś okres czasu korzystamy z przekierowania 302):
Redirect 301 / https://nowadomena.pl/
Przekierowanie jednej strony:
Redirect 301 /strona.html http://domena.pl/nowa_strona.html
Moduł przekierowań mod rewrite
Niezbędnym elementem do zmiany linków URL w trakcie zapytań jest moduł mod_rewrite. Ten moduł jest dość prosty, ale pozwala na utworzenie skomplikowanych reguł w niezliczonej ilości z dużą ilością zmiennych.
Aby aktywować moduł należy dodać takie reguły:
RewriteEngine On (włącza moduł do przetwarzania zapytań)
Options FollowSymLinks (warunek do działania mod_rewrite).
Jeśli administrator serwera wyłączył tą opcję dla folderu użytkownika, wtedy nie możemy użyć ten moduł. Takie ograniczenie może być nakładane na serwery hostingu współdzielonego ze względów bezpieczeństwa.
Pełna dokumentacja modułu mod_rewrite znajduje się pod linkiem – http://httpd.apache.org/docs/current/rewrite/ .
Definiowanie kodowania
Kodowanie, w którym strona ma zostać otwarta, określa przeglądarka. Można jednak ustawić domyślne kodowanie:
AddDefaultCharset UTF-8
Taka zmiana stosuje się do folderów, podporządkowanych .htaccess i na wszystkich stronach witryny. Można ustawić kodowanie dla określonego typu pliku, na przykład windows-1251 dla html:
AddType "application/x-httpd-php3; charset=windows-1251" .html
Często sama strona (a mianowicie nagłówki html) zawiera informacje o używanym kodowaniu. Należy sprawdzić, czy określone kodowanie w html i pliku konfiguracyjnym są zgodne. Kodowanie Utf-8 jest wymagane prawie przez większość popularnych systemów CMS, ponieważ obsługuje najwięcej użytkowników na całym świecie.
Konfiguracja bezpieczeństwa strony
Blokada możliwości wylistowania folderów i plików – w przypadku braku strony głównej (pliku index) w folderze i zapytaniu folderu bez wskazania pliku domyślnie serwer wyświetli listę wszystkich plików w folderze. Aby zablokować spis folderów i plików należy dodać do .htaccess regułę:
Options -Indexes
FilesMatch – kolejna przydatna reguła, która ogranicza reguły według rozszerzenia pliku wykorzystując Regular Expression. Przy jej pomocy można ograniczyć dostęp do wybranych plików:
<FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$"> Order Allow,Deny Deny from all </FilesMatch>
Aby zablokować przejścia na stronę z niektórych domen można wykorzystać następne reguły:
RewriteEngine on
RewriteCond %{HTTP_REFERER} spamdomena\.pl [NC,OR]
RewriteCond %{HTTP_REFERER} zladomena\.pl [NC,OR]
RewriteCond %{HTTP_REFERER} spamer\.pl [NC]
RewriteRule .* - [F]
Blokada przed spamem w komentarzach WordPress poprzez blokadę bezpośrednich zapytań do pliku wp-comments-post.php
:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*twoja-domena.pl* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
Optymalizacja działania strony
Zebraliśmy wszystkie reguły do optymalizacji działania i przyśpieszenia strony do jednego kodu, jednak zwracamy uwagę że nie wszystkie moduły mogą być włączone na serwerze co może powodować brak dostępu do strony. Warto wyłączać reguły blokami aby znaleźć przyczynę błędów:
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
<IfModule mod_expires.c>
# Enable expirations
ExpiresActive On
# Default directive
ExpiresDefault "access plus 1 month"
# My favicon
ExpiresByType image/x-icon "access plus 1 year"
# Images
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 month"
# Javascript
ExpiresByType application/javascript "access plus 1 year"
</IfModule>
<IfModule mod_deflate.c>
# Compress HTML, CSS, JavaScript, Text, XML and fonts
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
# Remove browser bugs (only needed for really old browsers)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
</IfModule>
# BEGIN Cache-Control Headers
<ifModule mod_headers.c>
<filesMatch ".(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "public"
</filesMatch>
<filesMatch ".(css)$">
Header set Cache-Control "public"
</filesMatch>
<filesMatch ".(js)$">
Header set Cache-Control "private"
</filesMatch>
<filesMatch ".(x?html?|php)$">
Header set Cache-Control "private, must-revalidate"
</filesMatch>
</ifModule>
# END Cache-Control Headers
# BEGIN Turn ETags Off
FileETag None
# END Turn ETags Off
Konfiguracja PHP
Aby serwer się nie zawieszał przy uruchomieniu niepoprawnie napisanych skryptów PHP istnieje ustawienie-parametr max_execution_time, którym można zdefiniować czas w sekundach na przetwarzanie skryptów PHP. Możemy zwiększyć ten czas oczekiwania na odpowiedź regułą:
php_value max_execution_time 60
Do zmiany ograniczenia wielkości wysyłanego pliku musimy wskazać nowy limit w htaccess:
php_value upload_max_filesize 128M (zamiast 128 należy wpisać własną liczbę).
Zapisywanie błędów PHP do osobnego pliku można skonfigurować w następny sposób:
php_flag log_errors on php_value error_log /home/uzytkownik/public_html/PHP_errors.log # PHP_errors.log — nazwa pliku, # /home/uzytkownik/public_html/ — ścieżka do niego).
Włączyć obsługę PHP w plikach .html możemy przy pomocy:
RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml
Wnioski
Przed każdą zmianą w pliku .htaccess zalecamy tworzyć kopie zapasową pliku, aby można było szybko wycofać wprowadzone zmiany. Ważne jest aby wprowadzać zmiany krok po kroku przy użyciu minimalnej ilości reguł – ponieważ w przypadku wystąpienia błędów dużo łatwiej będzie zidentyfikować problem lub niedziałającą regułę. Najczęstszym błędem serwera www podczas pracy z .htaccess — jest błąd serwera 500. Wskazuje to na problem w składni (na przykład literówka w regule).
Jeżeli brakuje dozwolonych przez administratora serwera modułów lub funkcji – polecamy zmiany hostingu na serwer VPS lub dedykowany z pełnym dostępem root to serwera www.