- [Show pagesource]
- [Old revisions]
- [[unknown link type]]
- []
Table of Contents
mod_rewrite
Modul mod_rewtite umožnuje skoro neomezené manipulace s URL adresami (presměrování, úpravy pro SEO, blokování stránek…).
Např.:
www.username.host.domain.com –> domain.com/foo/username/bar
www.host.domain.com/english/some_artice –> www.host.domain.com/some_article.html?lang=en
Nejlepší popis je hned na strankach apache:
Apache server musí mít v httpd.conf zapnutý modul mod_rewrite:
LoadModule rewrite_module modules/mod_rewrite.so
mod_rewrite příkazy
RewriteEngine on/off zapíná nebo vypíná přepisování url.
RewriteRule Pattern Substitution [flags]
Základní příkaz pro přepisování.
Pattern je klasický regexp.
Substition se může skládat ze znaků, proměných mod_rewritu (HTTP_HOST, QUERY_STRING, …) a z výstupu vyhodnocení regulárního výrazu (to co je v reqexp v zavorkach ())
Vstupem je cele URI (aspoň doufám) - to znamená pouze cesta k souboru na serveru např.: http://www.webmasterworld.com/**forum92/1084.htm**?lang=en. K adrese serveru a k HTTP GET parametrům se dá přistupovat pouze v příkazu RewriteCond.
Pokud se vstup shoduje se vzorem, tak se celý vstup přepíše tím co je v Substitution. Pokud se vstup neshoduje se vzorem, tak se nepřepisiuje nic. Pokud je nazačátku v Substitution uvedeno http://xxxxx tak se přepisuje úplně celé URL.
Přepisovací pravidla se procházejí sekvenčně za sebou, ale pokud se najde shoda a něco se přepíše, tak se začne s nově vznikým řetězcem od prvního pravidla. Tento princip tedy může vést k zacyklení.
Přepisování může být dvou typů - buď člověk u prohlížeče nic nevidí (URL se v adresním okně nemění) a nebo se URL přepíše na výsledný tvar - flag [R].
RewriteCond TestString CondPattern [flags]
Direktiva pro podmíněné přepisování. Pokud je splněná podmínka, tak se vykonají všechny příkazy až do příkazu s flagem [L] (last). Když podmínka splněna není, přeskočí se všechny příkazy až do flagu [L].
Logické operace:
AND - dvě RewriteCond následující hned za sebou (hned další řádek).
OR - dvě RewriteCondnásledující hned za sebou (hned další řádek), první příkaz má za sebou flag [OR].
TestString může být jakákoliv proměná mod_rewrite, ale i výstup z regexpu následujícího pravidla.
CondPattern libovolný regexp.
RewriteLog file-path zapíná logování do souboru. Výchozí adresář je adresář Apache.
RewriteLogLevel Level úroveň logování.
Konkrétní úkol
Je potreba nastavit mod_rewrite tak, aby se /de-de/ presmerovalo na
/?lang=de, /cs-cz/ na /?lang=cs atd. s tim, ze ostatni parametry predane
v url museji zustat zachovany
de-de → de
cs-cz → cs
sk-sk → sk
en-gb → en
es-es → es
Řešení
blablabla
RewriteEngine on RewriteCond %{QUERY_STRING} . RewriteRule (.*)/(..)-../(.*) $1/$3?%{QUERY_STRING}&lang=$2 [L,R] RewriteCond %{QUERY_STRING} !. RewriteRule (.*)/(..)-../(.*) $1/$3?lang=$2 [L,R]
RewriteCond %{QUERY_STRING} .
Testuje jestli vstup obsahuje HTTP GET parametry (v URL za otazníkem). “.” zamená alespoň jeden znak v QUERY_STRINGu.
RewriteCond %{QUERY_STRING} !.
Splněno v případě, že HTTP GET parametry jsou úplně prázdné. “!.” znamená žádný znak.
RewriteRule (.*)/(..)-../(.*) $1/$3?%{QUERY_STRING}&lang=$2 [L,R]
Cestu k souboru rozřeže na 3 části - názvy jazyka (např. en-en) a části před a za. Pokud vstup obsahoval něco za otazníkem, tak na konec přilepí nový parametr &lang=…. Pokud vstup neobsahoval nic za otazníkem, tak to vloží “?” a za něj parametr s názvem jazyka.
[L] … poslední pravidlo pro nejbližší předchozí RewriteRule.
[R] … URL se přepíše tak, že to bude vidět v okně s adresou u webového klienta.
Konkretni ukol c. 2
Presmerovat foobar.example.com → example.com/foobar
ServerAlias *.coolblog.cz RewriteEngine on RewriteLogLevel 3 RewriteLog /var/www/vhosts/coolblog.cz/statistics/logs/dalibor_test_r_log # RewriteCond %{HTTP_HOST} ^[^.]+\.coolblog\.cz$ # RewriteRule ^(.+) %{HTTP_HOST}$1 [C] # RewriteRule ^([^.]+)\.coolblog\.cz(.*) /user/?u=$1$2 [L] RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTP_HOST} ^([^.]+)\.coolblog\.cz RewriteRule ^/.*$ /dalibor/user/index.php?u=%1 [L]