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]
 
linux/apache/mod_rewrite.txt · Last modified: 2009/07/06 13:58 by admin