01 Sty

Jak poprawnie skonfigurować plik .htaccess ?

konfiguracja-htaccess

.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ę.

Polecamy nasz hosting, z rozbudowanym panelem admin cPanel, maksymalnie zoptymalizowany do wydajnego działania stron już za 50 zł/rok brutto z wbudowanym skanerem antywirusowym ImunifyAV! Z kodem RABATNABLOG dostaniesz dodatkowy rabat 15%

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

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.