====== 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: * [[http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html]] * [[http://httpd.apache.org/docs/2.2/rewrite/rewrite_intro.html]] * [[http://httpd.apache.org/docs/2.2/misc/rewriteguide.html]] 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ě **RewriteCond**ná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]