Wszystkie przekierowania w .htaccess musimy wpisywać po wpisie RewriteEngine On, który uruchamia mod_rewrite
Kolorem czerwonym oznaczone są wartości, które trzeba zamienić na pasujące do Waszego problemu. Na przykład:
- jeżeli chcecie przekierować domenę www.example.com to w wstawiacie ją w miejsce: NAZWA_DOMENY
- przekierowując katalog ‚/pl/’ na ‚/en/’ wstawiacie pl w miejsce: KAT_STARY a ‚/en/’ w miejsce: KAT_NOWY
- jak coś może być trudniejsze do szybkiego zrozumienia to przekierowania będą robione na przykładowych adresach URL (również zaznaczonych na czerwono)
Przekierowanie bez www-> www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L,NC]
Komentarz: proste kopiuj wklej, po prostu działa 🙂
Przekierowanie www -> bez www
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ http://NAZWA_DOMENY/$1 [R=301,L,NC]
Komentarz: nie można posłużyć się {HTTP_HOST} ponieważ zawiera ona www w sobie i będzie pętla przekierowań
Przekierowanie domeny na inną domenę
RewriteCond %{HTTP_HOST} ^(www\.)?STARA_DOMENA [NC]
RewriteRule (.*) http://NOWA_DOMENA/$1 [R=301,L]
Przekierowanie index.php i index.html na /
RewriteCond %{THE_REQUEST} ^.*/index\.(php|html)
RewriteRule ^(.*)index.(php|html)$ /$1 [R=301,L]
Komentarz: trzeba uważać czy nie przekieruje się również panelu zarządzania treścią
Najprostsze przekierowanie 1 do 1
RewriteRule ^STRONA_STARA/?$ $1/STRONA_NOWA$2 [R=301,L]
Komentarz: $1 i $2 są niby zbędne ale w niektórych ustawieniach serwera są wymagane. Jak ktoś wiec coś więcej na ten temat to proszę o skomentowanie 🙂
Przekierowanie adresu bez fragmentu URL (katalogu)
RewriteRule ^(.*)KAT_NIECHCIANY(.*)$ /$1$2 [R=301,L]
Komentarz: $1 wyświetla wartość zebraną przez pierwszy (), a $2 ma wartość z drugiego ()
Przekierowanie subfolderu na folder
Przykład: example.com/rewrite -> example..com/rewrite/end
RewriteCond %{REQUEST_URI} !pl/cat/rewrite/example/end
RewriteRule ^pl/cat/rewrite$ /pl/cat/rewrite/example/end [R=301,L]
Przekierowanie bez query stringa
RewriteRule ^STARY_ADRES/(.*)$ /NOWY_ADRES? [R=301,NC,L]
Komentarz: Dodanie ‚?’ na końcu adresu docelowego blokuje query string, który może się pojawić w (.*)
Przekierowanie adresu z query stringiem
RewriteCond %{REQUEST_URI} ^STARY_ADRES
RewriteCond %{QUERY_STRING} VARIABLE=VALUE
RewriteRule ^(.*)$ NOWY_ADES? [R=301,L]
Komentarz: dzięki warunkowi na query string przekierujemy tylko URL z tymi parametrami
Przekierowanie znaków specjalnych np. polskich liter
Zależnie od ustawień serwera używamy:
RewriteRule ^przyk\xC5\x82ad$ NOWY_ADRES? [R=301,NE,NC,L]
Komentarz: ZAMIAST % przy polskiej literze ‚Ł’ dajemy \x
drugie rozwiązanie:
RewriteRule ^STARY_ADRES$ http://www.example.com/przyk%C5\%82ad [R=301,NE,NC,L]
Komentarz: ‚\’ rozdzielamy znaki specjalne od ‚Ł’
trzecie rozwiązanie:
Można można trochę pójść na łatwiznę i znaki specjalne zastąpić (.*) (dowolny znak):
w tym wypadku ‚,’ (przecinek) pomiędzy częściami URLa został zastąpiony przez (.*):
RewriteRule ^KAT_STARY(.*)DALSZY_URL [R=301,L]
Dodanie i usunięcie rozszerzenia ‚.html’
Przypisanie adresów bez rozszerzenia do tych z html:
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Usunięcie rozszerzenia:
RewriteCond %{THE_REQUEST} \.html
RewriteRule ^(.*)\.html$ /$1 [R=301,L]
Dodanie i usunięcie slasha na końcu adresu
Usunięcie slasha:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
Dodanie slasha:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]
Wskazanie adresu do obsługi błędu 404
ErrorDocument 404 /KATALOG/404.php
Komentarz: dodajemy to na początku pliku htaccess
Dodanie „Wykorzystaj pamięć podręczną przeglądarki”
<FilesMatch „\.(ico|js|css|jpg|jpeg|png|gif)$”>
Header set Cache-Control „max-age=864000, public, must-revalidate”
Header unset Last-Modified
</FilesMatch>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
Komentarz: jest to rozwiązanie na informację o braku wykorzystania pamięci podręcznej przeglądarki w Google insights
Utworzenie przyjaznych adresów
Najbardziej łopatologiczne podejście ale często przydatne przy starych skryptach jak jest site 10 serwisu i nie chce się zastanawiać co ktoś miał na myśli tylko szybko wdrożyć i zapomnieć…
Indywidualnie:
RewriteRule ^example\.html$ ?id=5
RewriteCond %{REQUEST_URI} ^\/index\.php
RewriteCond %{QUERY_STRING} id=5
RewriteRule ^(.*)$ /example.html? [R=301,L]
Masowo:
RewriteRule ^produkty-(.+)\.html$ produkty.php?numer=$1&podnumer=$2&menu=$3 [L]
RewriteCond %{REQUEST_URI} ^\/produkty\.php
RewriteCond %{QUERY_STRING} numer=(.+)&podnumer=(.+)&menu=(.+)
RewriteRule ^(.*)$ /produkty-%1-%2-%3.html? [R=301,L]
Komentarz: w obu przypadkach musimy najpierw „przypisać” nowy przyjazny adres do query stringa mu odpowiadającego, a następnie go przekierować. W celu uniknięcia pętli przekierowań dajemy warunki na request uri z indexem (albo dowolnym innym adresem wspólnym) i na dokładny query string. Gdy nie ma części wspólnej adresu za którą możemy „złapać” trzeba posłużyć się przekierowaniem PHP.
Jak nie ma index.php (albo innego adresu do złapania) i query zaczyna się od /
Przykładowy PHP:
$adresy = array(
‚?id=1’ => ‚example.html’,
‚?id=5’ => ‚example-kontakt.html’,
‚?id=46’ => ‚example-article46.html’,
);
$uri = trim($_SERVER[‚REQUEST_URI’], ‚/’);
if(array_key_exists($uri, $adresy)) {
header(‚HTTP/1.1 301 Moved Permanently’);
header(‚Location: http://NAZWA_DOMENY/’ . $adresy[$uri]);
header(‚Connection: close’);
exit;}
W htaccess przypisujemy adresy:
RewriteRule ^example\.html$ ?id=1 [L]
RewriteRule ^example-kontakt\.html$ ?id=5 [L]
RewriteRule ^example-article46\.html$ ?id=46 [L]
Komentarz: tutaj podobnie jak wyżej w htaccessie musimy przypisać nowy adres do danego query stringa jednak, żeby uniknąć przekierowania adresu sam na siebie musimy przekierowania obsłużyć w PHP