====== 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]