htaccess a mod rewrite (2)

Napsal O webu (») 24. 4. 2006 v kategorii Banan.cz, přečteno: 5591×

mod rewrite - příklady

Co jsou ty další příznaky? (neboli flags) Jsou to další možnosti jak říct apach serveru jak s tímto pravidlem zacházet.

Jelikož je těchto flagů poměrně hodně, omezím se zde na ty nejpoužívanější.


  • L - Poslední pravidlo, dále už nic nepřepisuj
  • R (volitelně R=kod) - Přesměrování půjde s kódem, např.:R=302 (MOVED TEMPORARILY)
  • T=(MIME TYPE) - MIME
  • QSA - zachovej vše co je ve zdroji za otazníkem (např. paramtetry .php?neco=hodnota) Toto pravidlo, pokud jej vynecháte, může dlouho působit poměrně neplechu.
  • NC - case insensitive, neboli nezáleží na velikosti písmen
  • S - skip-přeskoč další pravidlo (volitelně S=počet)
  • E=VAR:VAL - nastavení enviromental proměnných
  • cookie|CO ? cookie :)
  • .... a další a další


Jak je vidět, tak i pomocí těchto málo flagů lze vytvořit poměrně slušně i složité konstrukce. Více ale uvidíme na konkrétních příkladech.

 

Příklady: Na úvod si dáme velice jednoduchý příklad z praxe. Dejme tomu, že chcete přeložit nějakou Vaši zdrojovou stránku, na jinou cílovou stránku.
RewriteRule zdroj\\.html /cil\\.html
A co takhle rovnou celé domény:
RewriteCond %{HTTP_HOST} ^puvodni-domena.cz [NC]

RewiteRule ^(.*)$ http://www.nova-domena.cz/$1 [R=301,QSA,L]

Jak je patrné, dá se toto pravidlo použít i ke směrování na stránky jak s www, tak bez www.


Nebo se Vám nelíbí, že generujete nějakou stránku a má špatnou příponu? Třeba u hotových komponent pro XML (nebo pokud použijete jednoduše výpis PHP obsahu) je často výstup soubor s příponou definovanou serverem. Pokud tedy předáváte uživateli často takovéto soubory, ale napřed je upravujete například na .php, nebo rovnou XML, stačí přidat následující:
RewriteRule ^soubor\\.xml$ %{DOCUMENT_ROOT}/php/soubor.php
Jak je na první pohled patrné, tak se asi bez znalosti reg. výrazů asi neobejdete, takže pokud tápete, přečtěte si nejdříve něco o nich.

Pokud chcete například používat více hostů na serveru, pomůže Vám například něco takového:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]

RewriteCond %{REMOTE_HOST} ^host2.*

V tomto příkladu je použitý ještě flag OR pro spojení pravidel.


Jak je vidět, jednoduché věci se dělají snadno, takže se podíváme na trochu komplikovanější příklady.

Pokud budete chtít například nasměrovat klienta čtenáře na správnou verzi stránek a chcete to udělat ještě před jejich vytvářením, použijte jednoduché pravidlo:
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*

RewriteRule ^/$ /homepage.max.html [L]



RewriteCond %{HTTP_USER_AGENT} ^Lynx.*

RewriteRule ^/$ /homepage.min.html [L]



RewriteRule ^/$ /homepage.std.html [L]


Na ukázku je tam Lynx, ale může tam být například identifikace mobilu, PDA, atp.


Základ už je nyní asi jasný, takže si ukážeme další použitelný příklad z praxe:


Komprese:
AddOutputFilterByType DEFLATE text/css

AddOutputFilterByType DEFLATE application/x-javascript

AddOutputFilterByType DEFLATE text/html

BrowserMatch ^Mozilla/4\\.0[678] no-gzip

BrowserMatch \\bMSIE !no-gzip

#Header append Vary User-Agent

# nějaké další hlavičky pro různé klienty

# DeflateCompressionLevel 9

# DeflateFilterNote Input instream

# DeflateFilterNote Output outstream

# DeflateFilterNote Ratio ratio

 


Pokud si to všechno vyzkoušíte, tak asi brzo zjistíte, že udělat pomocí htaccess a modu rewirte takzvaná hezká URL není vůbec žádný problém. Jde to například tak, že si skriptu předáte požadovaný řetězec jako parametr. Skripty pak pracují naprosto normálně a uživatel může používat URL ve tvrau: http://rendlik.bloger.cz/recepty/Sladke-dobroty/Orechove-rohlicky (hned jsem na ně dostal chuť :) )

To je více méně vše, pokud přece jen chcete vědět něco více o modu rewrite (v angličtině z Apache webu)



Autor: mimi

Štítky: mod rewrite
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
brade-cz z IP 212.90.254.*** | 15.8.2006 11:41
mam rewrite kod:
RewriteRule ^kategorie/([0-9]+)_(.+)/([0-9]+)_(.+)/$ _scripts/categ.php?cid1=$1&cid2=$3 [L,QSA]
RewriteRule ^kategorie/([0-9]+)_(.+)/$ _scripts/categ.php?cid1=$1 [L,QSA]


kdyz zadam primou adresu tak mi to hodi 404ku ale pokud se tam jednoduse proklikam tak je to dobry. V cem to muze byt?
napr neco.cz/kategorie/551_parfemy/ - kdyz to dam do adresy tak sup 404smajl
banan.czMgr.Radovan Kaluža | 15.8.2006 13:10
konkretne to dela kde ?
brade-cz z IP 212.90.254.*** | 15.8.2006 14:11
Myslite domenu? hs-sport.cz ale tam jsou kody nasledujici:
RewriteRule ^sortiment/(.*)/$ _assortment.php?filter=$1 [L,QSA]
RewriteRule ^sortiment/(.*)/(.+).html?$ _assortment.php?filter=$1&filter2=$2
brade-cz z IP 212.90.254.*** | 15.8.2006 14:12
Dela mi to i na hostingu u active24 a nevim proc
banan.czMgr.Radovan Kaluža | 15.8.2006 16:11
uvedte konkretni odkaz ktery nefunguje

máte stoprocentně špatně .htaccess, mod rewrite, totiž nemá žádné direktivy při instalaci na server
brade-cz z IP 212.90.254.*** | 16.8.2006 20:18
napr: www.hs-sport.cz/sortiment/nike/fotbalova-obuv.html

komplet htaccess:
RewriteEngine on
RewriteBase /

Options -Indexes

ErrorDocument 403 "http://error.hs-sport.cz/?403"
ErrorDocument 404 "http://error.hs-sport.cz/?404"

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.* - [L]
RewriteRule ^akce.html?$ _actions.php [L,QSA]
RewriteRule ^o-firme.html?$ _about.php [L,QSA]
RewriteRule ^sortiment/$ _assortment.php [L,QSA]
RewriteRule ^sortiment/(.*)/$ _assortment.php?filter=$1 [L,QSA]
RewriteRule ^sortiment/(.*)/(.+).html?$ _assortment.php?filter=$1&filter2=$2 [L,QSA]
RewriteRule ^detail/([0-9]+)-(.+).html$ _item.php?id=$1 [L,QSA]
RewriteRule ^detail/(.*)/([0-9]+)-(.+).html$ _item.php?id=$2 [L,QSA]
brade-cz z IP 212.90.254.*** | 16.8.2006 20:31
divne je vsak to, ze to 404 vyhodi jak komu. Jakoby byl nejakym zpusobem v tu chvili vytizen. Ja kdyz zadam do prohlizece adresu shop.bscom.cz/kategorie/6_zakladni-desky/24_socket-939/ tak mi to funguje ale kdyz ji zada kamarad tak nesmajl nevim v cem je problem
Gas-O z IP 213.192.39.*** | 19.3.2007 17:02
Zdaravim, korektne mi nefunguje mod_rewrite na subdomene
Napsal jsem tohle na zmenu URL:

RewriteEngine On
RewriteCond %{REQUEST_URI} ^(.*)/([^/]+)/(([^/]+)/?)?$
RewriteRule .* index.php?kat=%2&menu=%4 [QSA]

Prakticky, kdyz mam <a href="firma/kontakt">neco</a> vysledek by mela byt url ve tvaru domena.kon/firma/kontakt/
na localhostu to funguje, na subdomene nikoliv
uz jsem zkousel pridat "RewriteBase /" i "/" pred index.php, ale zadny z vyse popisovanych prikladu muj problem nevyresilo ...
Dokaze mi nekdo poradit ? Pripadne vice problem upresnim
banan.czMgr.Radovan Kaluža | 19.3.2007 17:15
http://www.owebu.cz/777-1104-mod_rewrite-na-subdomene
Gas-O z IP 213.192.39.*** | 19.3.2007 17:21
Tohle vlakno jsem samozdrejme cetl, ale nic z uvadenych veci mi nepomohlo ....
banan.czMgr.Radovan Kaluža | 19.3.2007 18:12
1/ kde mate ctvrty parametr v regularnim vyrazu, posledni je treti a je tam slozena zavorka

2/ funkcni prilad
RewriteRule ^(.+)/(.+)$      /index.php?p1=$1&p2=$2            [L]
Freeze z IP 62.129.60.*** | 2.9.2007 14:31
Zdravím, mam jeden maly problem s mod_rewrite a .htaccessem. Snazim se presmerovat stranku bez 'www' na stranku s www pomoci R=301, ale pokazde to vrati error 404. UProchazel jsem snad vsechny navody a tipy na internetu, ale vysleek byl bohuzel stejny. V .htaccessu mam toto:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domena\.info [NC]
RewriteRule ^(.*)$ www.domena.info/$1 [R=301,QSA,NE,L]
ErrorDocument 403 "http://www.domena.info/error/403.php"
ErrorDocument 404 "http://www.domena.info/error/404.php"
Options -Indexes

Neví někdo, prosím, kde by mohla být chyba nebo co je špatně? Děkuji. Rád se nechám poučit.
| 2.9.2007 14:41
Dobré odpoledne,
zkoušel jste toto?

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domena.info
RewriteRule (.*) www.domena.info/$1 [R=301,QSA,L]
Freeze z IP 82.99.142.*** | 4.9.2007 21:36
No, zkoušl. Výsledek byl úplně stejný jako v přecházejících případech ... error 404. Nevi nikdo nic co je 'spatne'? dik
Freeze z IP 82.99.142.*** | 5.9.2007 15:30
No tak už to funguje :-D
Dik.
banan-jakub z IP 85.160.81.*** | 7.9.2007 09:41
[4] alespoň řekni včem byla chyba, ať se z toho poučí zbytek uživatelů. smajl


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel jedenáct a tři