.htaccess: Różnice pomiędzy wersjami
Kacperinjo (dyskusja | edycje) |
|||
(Nie pokazano 25 wersji utworzonych przez 5 użytkowników) | |||
Linia 1: | Linia 1: | ||
− | ''.htaccess'' to plik konfiguracyjny, który pozwala samodzielnie definiować zestawienia reguł rewrite. Jest zgodny ze "standardem" | + | ''.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 <code class="directory">.htaccess</code> 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 <code class="directory">.htaccess</code> może znajdować się w katalogu głównym [[WWW|domeny]]: <code class="directory">/usr/home/''login''/domains/''domena''/</code> bądź w dowolnym jego podkatalogu. | Plik <code class="directory">.htaccess</code> może znajdować się w katalogu głównym [[WWW|domeny]]: <code class="directory">/usr/home/''login''/domains/''domena''/</code> bądź w dowolnym jego podkatalogu. | ||
+ | |||
+ | Błąd w składni <code class="directory">.htaccess</code> spowoduje wyświetlenie na stronie komunikatu 500. | ||
=== Przykłady === | === Przykłady === | ||
Linia 7: | Linia 11: | ||
Poniżej znajduje się kilka przykładów zastosowania tego pliku. Część z nich jest autorstwa użytkowników MyDevil. | Poniżej znajduje się kilka przykładów zastosowania tego pliku. Część z nich jest autorstwa użytkowników MyDevil. | ||
− | ====Przekierowanie | + | ====Przekierowanie na SSL==== |
+ | |||
+ | Przekierowanie domeny na szyfrowane połączenie SSL. | ||
+ | <syntaxhighlight lang="apache"> | ||
+ | RewriteEngine On | ||
+ | RewriteCond %{SERVER_PORT} 80 | ||
+ | RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ====Obsługa zmiennej HTTPS==== | ||
+ | |||
+ | Umożliwia wykrywanie czy połączenie zostało nawiązane przy pomocy bezpiecznego połączenia SSL. | ||
+ | <syntaxhighlight lang="apache"> | ||
+ | RewriteEngine On | ||
+ | RewriteCond %{HTTPS} off | ||
+ | RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] | ||
+ | </syntaxhighlight> | ||
− | Przekierowanie subdomeny test.domena na domena/test bez tworzenia vhosta. | + | ====Przekierowanie subdomeny test.domena na domena/test bez tworzenia vhosta.==== |
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
RewriteEngine On | RewriteEngine On | ||
Linia 15: | Linia 35: | ||
RewriteCond %{REQUEST_URI} !^/test/ | RewriteCond %{REQUEST_URI} !^/test/ | ||
RewriteRule ^(.*)$ /test/$1 [L] | RewriteRule ^(.*)$ /test/$1 [L] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ====Przekierowanie wszystkich subdomen *.domena.pl na domena/* bez tworzenia vhostów.==== | ||
+ | <syntaxhighlight lang="apache"> | ||
+ | RewriteEngine On | ||
+ | RewriteCond %{HTTP_HOST} ^((?!www\.)[^.]+)\.domena\.pl$ | ||
+ | RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/? | ||
+ | RewriteRule ^(.*)$ /%1/$1 [L,QSA] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Linia 33: | Linia 61: | ||
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
− | + | RewriteEngine on | |
− | RewriteCond %{ | + | RewriteCond %{REQUEST_FILENAME} !-d |
− | + | RewriteCond %{REQUEST_FILENAME}\.html -f | |
− | RewriteCond %{ | + | RewriteRule ^(.*)$ $1.html |
− | RewriteRule (.*) | ||
− | |||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Linia 58: | Linia 83: | ||
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. | 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 <code>htpasswd -c /usr/home/''login''/hasla.passwd ''username''</code>. Folder, który ma być chroniony hasłem powinien zawierać plik .htaccess o następującej treści: | + | Plik z hasłami należy utworzyć dodając pierwszego użytkownika poleceniem <code>htpasswd -c /usr/home/''login''/hasla.passwd ''username''</code> oraz nadać uprawnienia odczytu <code>chmod +r /usr/home/''login''/hasla.passwd</code>. Folder, który ma być chroniony hasłem powinien zawierać plik .htaccess o następującej treści: |
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
AuthType Basic | AuthType Basic | ||
Linia 97: | Linia 122: | ||
Options -Indexes | Options -Indexes | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | ==== Parsowanie strony jako XHTML/XML ==== | ||
+ | Aby wymusić użycie przez przeglądarkę parsera XHTML/XML, należy dodać linijkę | ||
+ | <syntaxhighlight lang="apache"> | ||
+ | AddType application/xhtml+xml .html | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== Przekierowanie adresu strony z www na bez www ==== | ||
+ | |||
+ | <syntaxhighlight lang="apache"> | ||
+ | RewriteEngine On | ||
+ | RewriteBase / | ||
+ | RewriteCond %{HTTP_HOST} www.domena [NC] | ||
+ | RewriteRule ^(.*)$ http://domena%{REQUEST_URI} [R=301,L] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== Przekierowanie z domeny do subfolderu tej samej domeny ==== | ||
+ | |||
+ | <syntaxhighlight lang="apache"> | ||
+ | RewriteEngine On | ||
+ | RewriteRule ^$ /fsubfolder [L] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== Header set Cache-Control ==== | ||
+ | |||
+ | Ustaw cacheowanie plików graficznych jako public oraz js i css jako private na 24h. | ||
+ | |||
+ | <syntaxhighlight lang="apache"> | ||
+ | <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> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Wyłącz cache plików html | ||
+ | |||
+ | <syntaxhighlight lang="apache"> | ||
+ | <filesmatch "\.(html|htm)$"> | ||
+ | Header set Cache-Control "max-age=0, private, must-revalidate" | ||
+ | </filesmatch> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== 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. | ||
+ | |||
+ | <syntaxhighlight lang="apache"> | ||
+ | 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" | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Zamiast <code>access</code> można też wykorzystać: | ||
+ | |||
+ | * now - to samo co 'access' | ||
+ | * modification - czas modyfikacji pliku | ||
+ | |||
+ | Przykładowo | ||
+ | |||
+ | <syntaxhighlight lang="apache"> | ||
+ | ExpiresByType image/png "modification plus 1 year" | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 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 <code class="directory">.htaccess</code> następujące konstrukty: | ||
+ | |||
+ | <syntaxhighlight lang="apache"> | ||
+ | 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> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === Odnośniki zewnętrzne === | ||
+ | * [https://github.com/rechandler12/htaccess-configs-mydevil Zewnętrzne repozytorium z przykładowymi regułami .htaccess] | ||
[[Category:WWW]] | [[Category:WWW]] |
Aktualna wersja na dzień 22:14, 17 wrz 2021
.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.
Spis treści
- 1 Przykłady
- 1.1 Przekierowanie na SSL
- 1.2 Obsługa zmiennej HTTPS
- 1.3 Przekierowanie subdomeny test.domena na domena/test bez tworzenia vhosta.
- 1.4 Przekierowanie wszystkich subdomen *.domena.pl na domena/* bez tworzenia vhostów.
- 1.5 Przekierowanie za pomocą 301
- 1.6 Hostowanie stron html bez rozszerzenia
- 1.7 Zabezpieczenie przed hotlinkowaniem obrazków
- 1.8 Zabezpieczanie katalogu hasłem
- 1.9 Domyślne kodowanie plików tekstowych
- 1.10 Blokowanie adresów IP
- 1.11 Blokowanie ze względu na domenę
- 1.12 Blokowanie indeksowania zawartości
- 1.13 Parsowanie strony jako XHTML/XML
- 1.14 Przekierowanie adresu strony z www na bez www
- 1.15 Przekierowanie z domeny do subfolderu tej samej domeny
- 1.16 Header set Cache-Control
- 1.17 ExpiresByType
- 1.18 Kompresja GZIP
- 2 Odnośniki zewnętrzne
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>