fbpx

Co robimy

Ściąga z przekierowań i reguł w htaccess

W ramach uporządkowania struktury wpisów przenieśliśmy z nieistniejącego już bloga małą ściągę z najczęściej używanymi przekierowaniami i regułami w htaccessie. Mamy nadzieję, że się przyda 🙂 Wszystko jest przygotowane do podstawienia danych albo po prostu Ctrl+c Ctrl+v – kopiujcie śmiało!

redirect

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:

1. jeżeli chcecie przekierować domenę www.example.com to w wstawiacie ją w miejsce: NAZWA_DOMENY

2. przekierowując katalog ‚/pl/’ na ‚/en/’ wstawiacie pl w miejsce: KAT_STARY a ‚/en/’ w miejsce: KAT_NOWY

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

sprawdź też

Porozmawiajmy

Powiedz nam czego potrzebujesz

Kontakt