.htaccess

(Przekierowano z Htaccess)

.htaccess to plik konfiguracyjny, który pozwala samodzielnie definiować zestawienia reguł rewrite. Jest zgodny ze "standardem" Apache i obsługuje go autorski moduł do ngnix.

Plik .htaccess obsługiwany jest na stronach typu PHP. Nie należy edytować go edytorem tekstu automatycznie dodającym dodatkowe znaczniki BOM (może to spowodować błędne działanie dodanych regułek). W przypadku Notepad++ znak końca linii musi być [LF] (a nie [CR][LF]). Plik zalecamy edytować zdalnie po zalogowaniu się na konto poprzez SSH wykorzystując dostępne edytory (vi, nano, ee itd.). W razie potrzeby znaczniki BOM można usunąć w edytorze mcedit dostępnym po zalogowaniu się na konto poprzez SSH.

Plik .htaccess może znajdować się w katalogu głównym domeny: /usr/home/login/domains/domena/ bądź w dowolnym jego podkatalogu.

Błąd w składni .htaccess spowoduje wyświetlenie na stronie komunikatu 500.

Przykłady

Poniżej znajduje się kilka przykładów zastosowania tego pliku. Część z nich jest autorstwa użytkowników MyDevil.

Przekierowanie na SSL

Przekierowanie domeny na szyfrowane połączenie SSL.

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Obsługa zmiennej HTTPS

Umożliwia wykrywanie czy połączenie zostało nawiązane przy pomocy bezpiecznego połączenia SSL.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Przekierowanie subdomeny test.domena na domena/test bez tworzenia vhosta.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?test\.domena$ [NC]
RewriteCond %{REQUEST_URI} !^/test/
RewriteRule ^(.*)$ /test/$1 [L]

Przekierowanie wszystkich subdomen *.domena.pl na domena/* bez tworzenia vhostów.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.domena\.pl$
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/?
RewriteRule ^(.*)$ /%1/$1 [L,QSA]

Przekierowanie za pomocą 301

Przekierowanie dla jednej strony do domena:

Redirect 301 /strona.php http://domena/strona.html

Przekierowanie całej strony do domena:

Redirect 301 / http://domena/

Przekierowanie całej strony do subfolderu domena:

Redirect 301 / http://domena/subfolder/

Przekierowanie subfolderu strony do domena:

Redirect 301 /subfolder http://domena/

Przekierowanie żądań do plików html do plików z tą samą nazwą z rozszerzeniem php:

RedirectMatch 301 (.*)\.html$ http://domena$1.php

Hostowanie stron html bez rozszerzenia

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

Zabezpieczenie przed hotlinkowaniem obrazków

Hotlinkowanie to umieszczanie na stronie obrazków, które użytkownik pobiera z zewnętrznego serwera. Przykładowa blokada wygląda następująco.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://domena$      [NC]
RewriteCond %{HTTP_REFERER} !^http://.*\.domena$      [NC]
RewriteCond %{HTTP_REFERER} !^http://domena/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://.*\.domena/.*$      [NC]
RewriteRule .*\.(jpg|jpeg|gif|bmp)$ - [F,NC]

Zabezpieczanie katalogu hasłem

Istnieje możliwość zabezpieczenia całego katalogu na stronie hasłem (lub nawet całej strony WWW). W poniższych przykładach argument username należy zastąpić loginem wybranego użytkownika, a argument login loginem konta MyDevil.

Plik z hasłami należy utworzyć dodając pierwszego użytkownika poleceniem htpasswd -c /usr/home/login/hasla.passwd username oraz nadać uprawnienia odczytu chmod +r /usr/home/login/hasla.passwd. Folder, który ma być chroniony hasłem powinien zawierać plik .htaccess o następującej treści:

AuthType Basic
AuthUserFile "/usr/home/login/hasla.passwd"
require valid-user
AuthName "Zabezpieczony katalog"

AuthUserFile wskazuje na plik, który utworzono wcześniej. Jest możliwość używania różnych plików z loginami i hasłami do różnych folderów. Usuwanie użytkownika odbywa się za pomocą polecenia htpasswd -D /usr/home/login/hasla.passwd username.

Domyślne kodowanie plików tekstowych

W przypadku udostępniania plików .txt w których nie sposób określić kodowania znacznikiem meta bądź innych plików w których nie ustawiono kodowania można wymusić prawidłowe wyświetlanie przez przeglądarki za pomocą dyrektywy AddDefaultCharset, np.

AddDefaultCharset utf-8

Blokowanie adresów IP

Blokowanie konkretnego adresu ip:

deny from 123.123.123.123

Blokowanie zakresów ip (123.123.123.1 - 123.123.123.254):

deny from 123.123.123.0/24

Blokowanie ze względu na domenę

Blokowanie dostępu do strony, jeśli wejście nastąpiło z domena.com lub domena.net:

RewriteEngine On
RewriteCond %{HTTP_REFERER} domena\.com [NC,OR]
RewriteCond %{HTTP_REFERER} domena\.net
RewriteRule .* - [F]

Blokowanie indeksowania zawartości

Blokowanie indeksowania zawartości katalogów/katalogu bez pliku index.html/index.php:

Options -Indexes

Parsowanie strony jako XHTML/XML

Aby wymusić użycie przez przeglądarkę parsera XHTML/XML, należy dodać linijkę

AddType application/xhtml+xml .html

Przekierowanie adresu strony z www na bez www

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} www.domena [NC]
RewriteRule ^(.*)$ http://domena%{REQUEST_URI} [R=301,L]

Przekierowanie z domeny do subfolderu tej samej domeny

RewriteEngine On
RewriteRule ^$ /fsubfolder [L]

Header set Cache-Control

Ustaw cacheowanie plików graficznych jako public oraz js i css jako private na 24h.

<filesMatch ".(jpg|jpeg|png|gif|ico)$">
  Header set Cache-Control "max-age=86400, public"
</filesMatch>
<FilesMatch "\.(css|js)$">
  Header set Cache-Control "max-age=86400, private"
</FilesMatch>

Wyłącz cache plików html

<filesmatch "\.(html|htm)$">
   Header set Cache-Control "max-age=0, private, must-revalidate"
</filesmatch>

ExpiresByType

Ustaw czas wygaśnięcia cache dla plików graficznych na rok od dostępu, miesiąc od dostępu dla css, pdf, skryptów JavaScript i plików flash, oraz domyślny czas wygaśnięcia na datę dostępu plus 3 dni.

ExpiresActive On

ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType text/css "access plus 1 month"

ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 3 days"

Zamiast access można też wykorzystać:

  • now - to samo co 'access'
  • modification - czas modyfikacji pliku

Przykładowo

ExpiresByType image/png "modification plus 1 year"

Ustawi wygaśnięcie cache na rok od czasu modyfikacji pliku png.

Do modyfikowania czasu można wykorzystać słowa kluczowe:

  • years
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds

Kompresja GZIP

Kompresję GZIP można ustawić bezpośrednio w panelu DevilWeb przy danej stronie w "Strony www" przy "Szczegółach" jak i poprzez Devil. Poniższy przykład nie wskazuje jak włączyć GZIP dla strony.

Aby serwować pliki, które zostały skompresowane uprzednio GZIP (są od razu zapisane w formacie GZIP w drzewie katalogów) przy założeniu, że mają rozszerzenie html_gzip, należy umieścić w pliku .htaccess następujące konstrukty:

AddType text/html .html_gzip
AddEncoding gzip .html_gzipRewriteEngine on
RewriteRule ^(.*)\.html$ $1.html_gzip [QSA,L]
<FilesMatch "(\.html_gzip)$">
Header append Content-Encoding gzip
</FilesMatch>

Odnośniki zewnętrzne