To ja dorzucę jeszcze tak po mojemu
Podstawy mod_rewrite (.htaccess) - przyjazne linki.
Budowa adresu:
https://www.forum.optymalizacja.com/index.php?showforum=9
"https://" - protokół http
"www.forum.optymalizacja.com" - HTTP_HOST
"/index.php" - REQUEST_URI
"showforum=9" - QUERY_STRING
Idea stosowania mod_rewrite polega na używaniu w skryptach (i nie tylko) prostych, krótkich i łatwych w zapamiętaniu odnośników.
Domyślnie serwer apache na podstawie REQUEST_URI poszukuje rzeczywistych plików i katalogów w drzewie DOCUMENT_ROOT.
Dzięki instalacji i aktywacji mod_rewrite uzyskujemy możliwość operowania na "wirtualnym" REQUEST_URI które nie musi się już odnosić
bezpośrednio do "fizycznie" istniejących plików i katalogów tylko pośrednio przez odpowiednie reguły przepisywania.
Oczywiście możliwości mod_rewrite są znacznie większe.
Wszystkie reguły przetwarzania umieszczamy w pliku .htaccess który przetwarzanie wygląda tak:
RewriteEngine On - włączenie przepisywania linków
RewriteBase /halo - linia potrzebna kiedy plik .htaccess znajduje się w innym folderze niż DOCUMENT_ROOT
.* - dalej są zawarte reguły przepisywania
Sam plik .htaccess ma także więcej zastosowań niż przepisywanie linków.
Podstawy przepisywania w praktyce (wymagana znajomość podstaw PCRE i ogólnej wiedzy na temat zmiennych serwera i działania skryptów).
Dyrektywa RewriteRule służy do przeprowadzania operacji na zmiennej REQUEST_URI serwera:
RewriteRule wyrazenie_regularne rzeczywisty_adres [flagi]
"wyrazenie_regularne" będzie dopasowywane do REQUEST_URI otrzymanego z zewnątrz lub z poprzedniej reguły przepisywania (jeżeli taka była).
Przykłady:
- chcemy używać zamiast adresu "https://www.forum.optymalizacja.com/index.php?showforum=9" adresu "https://www.forum.optymalizacja.com/dowcipy/"
RewriteRule ^/dowcipy/?$ /index.php?showforum=9 [L,NC]
- chcemy używać wszystkich kategorii symulując katalogi, musimy dołożyć zmienną określającą numer kategorii "https://www.forum.optymalizacja.com/dowcipy,9/"
RewriteRule ^/[a-z]*,([0-9]*)/?$ /index.php?showforum=$1 [L,NC]
Jeżeli chcemy przekazać część przetwarzanego REQUEST_URI do rzeczywistego adresu umieszczamy odpowiednie części wzorca (wyrażenia regularnego) w nawiasach (),
przechwycone części zostaną umieszczone w zmiennych o nazwach $1, $2, $3 ... $9 według kolejności nawiasów. Zmienna $0 zawiera całość dopasowaną do wzorca.
Flagi - sterują działaniem reguł, są dodawane na końcu w nawiasach []:
[NC] - wielkość liter nie ma znaczenia
[L] - jeżeli REQUEST_URI zostanie dopasowane do wzorca to reguła zawierająca tą flagę zostanie wykonana jako ostatnia.
[QSA] - powoduje doklejenie QUERY_STRING po przepisaniu REQUEST_URI
[R=301] - powoduje przekierowanie 301
RewriteCond - dyrektywa warunkowa, może służyć do przechwytywania i sprawdzania zmiennych serwera.
RewriteCond %{ZMIENNA_SERWERA} wyrazenie_regularne [falagi]
Jeżeli określony warunek RewriteCond zostanie spełniony zostanie wykonana dyrektywa RewriteRule położona bezpośrednio po nim.
Kilka dyrektyw RewriteCond występujących kolejno po sobie tworzy jedną całość powiązaną logicznym warunkiem AND(i).
Flagi:
[OR] - wiąże dyrektywę z następną (bezpośrednio po niej) dyrektywą RewriteCond związkiem logicznym OR(lub)
[NC] - wielkość liter nie ma znaczenia
Przykłady:
- chcemy sprawdzić czy wywołano adres z www
RewriteCond %{HTTP_HOST} ^www\. [NC]
- chcemy sprawdzić czy adres wywołano bez www
RewriteCond %{HTTP_HOST} !^www\. [NC]
- chcemy przechwycić wartości zmiennych QUERY_STRING i przekazać do RewriteRule
RewriteCond %{QUERY_STRING} strona=([a-z]+)&id=([0-9]+) [NC]
RewriteRule . index.php?s=%1&i%2 [L]
Kolejne części QUERY_STRING zostały przechwycone przez nawiasy do kolejnych zmiennych %1 %2, a %0 zawiera całość dopasowania.
Praktyczne przykłady:
- przekierowanie podstrony na inną podstronę
RewriteRule ^/kotek.html$ /piesek.html [R=301,NC]
- przekierowanie na nową domenę
RewriteRule .* https://nowy-adres.com/$0 [R=301]
- przekierowanie z www na bez www
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule . https://adres.com [R=301]
- przekierowanie z bez www na www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule . https://www.adres.com/ [R=301]
- uniwersalne przekierowanie na www z bez www
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www\.%{HTTP_HOST}/$0 [R=301]
Część rzeczy się powtarza ale zostawiam to jako całość.
[dodane]
- przekierowanie na inną domenę, z wyjątkiem tego co znajduje się w katalogu "folder"
RewriteCond %{REQUEST_URI} !^/folder/ [NC]
RewriteRule ^(.*)$ https://www.google.pl/$1 [L,R=301]