mod_rewrite a hezké url díl II

 |  mod_rewrite  |  20 928x
_

V minulém dílu článku mod_rewrite a hezké url jsem Vám ukázal pár jednoduchých přepisů pro domény nižších řádů, přesměrování na url s / bez www, zpětné přesměrování ze subdomény na doménu a na konec samotný přepis hezkých url pro jednu a dvě proměnné. V druhém dílu seriálu se pokusím popsat základní problémy, které mohou nastat s použitím mod_rewrite a uvedu některé další příklady. Například jsem se často setkal s věčným opakováním RewriteEngine On a RewriteBase před každám pravidlem: ne, není nutné to stále opakovat. Co ale musí být u každé další proměnné uvedeno, je RewriteCond. Podmínka RewriteCond testuje, zda-li soubor či adresář daného jména neexistuje. (! negace, - parametr, d=dir - složka, f=file - soubor)

# mujweb.cz/?page=neco > mujweb.cz/neco/

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?page=$1

Když se tedy znovu podíváme na základní příklad z prvního dílu: RewriteEngine On - zapneme mod_rewrite. RewriteBase - budeme vycházet z kořenového adresáře. RewriteCond - podmínka, otestujeme možnou existenci souboru či adresáře se stejným jménem. REQUEST_FILENAME je speciální proměnná právě pro modul mod_rewrite. No a RewriteRule je pouze regulární výraz, první v pořadí je výsledná url, druhý výraz je skutečná url, kterou budeme podstrkávat.

Nejčastější problémy při použití mod_rewrite jsou dva: nefungují styly, nenačtou se obrázky. K vyřešení můžeme použít element <base>, nebo absolutní odkazy. Jak celé i s http, tak pouze absolutní cesty v rámci vlastního webu začínající lomítkem. Pokud ani jedno nepomůže, problém hledejte v samotném .htaccessu. Pokud zapomenete otestovat možnost existence souboru / složky, styly a obrázky se Vám nemusí vůbec načíst.

Jestli si myslíte, že musíte používat adresy ve tvaru /?page=neco abyste nebyli ochuzeni o pěknou adresářovou strukturu, tak Vás rád vyvedu z omylu: pomocí následujícího přepisu můžeme podstrčit pěknou url i souborům s koncovkou *.php:

# clanek.php => /clanek/

RewriteEngine On
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1.php [L]

RewriteCond %{REQUEST_URI} !.[[:alnum:]]+$
RewriteRule ^(.+[^/])$ /$1/ [R=301] 

Tento přepis ale není příliš propracovaný: pokud zadáme adresu bez lomítka, vyskočí chyba 404. To vyřešíme velice snadno přidáním posledních dvou řádků, které automaticky doplní lomítko na konec adresy. Při zadání adresy bez lomítka proběhne přesměrování na správnou url, kde už se načte požadovaný soubor. Pokud samotný soubor pracuje dále s proměnnými, adresy mohou vypadat následovně: /clanek.php?id=20 > /clanek/?id=20

A že je vždy potřeba dynamických stránek pro mod_rewrite? Výše uvedené lze použít i u obyčejných statických stránek s příponou *.html. Stačí změnit jeden řádek:

# soubor.html => /soubor/

RewriteEngine On
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1.html [L]

RewriteCond %{REQUEST_URI} !.[[:alnum:]]+$
RewriteRule ^(.+[^/])$ /$1/ [R=301]

Automatické přidání lomítka na konec adresy pak můžeme použít i samostatně: (doporučuji)

RewriteCond %{REQUEST_URI} !.[[:alnum:]]+$
RewriteRule ^(.+[^/])$ /$1/ [R=301]

Na závěr se ještě podíváme na příznaky. To jsou ta písmenka v závorce za každým z pravidel:

 

Příznaky (flags)

V některých přepisech je nutné použít takzvané příznaky (flags), které mají různé významy. Uvedu zde nejpoužívanější:

[L] (last) Poslední pravidlo - další překlad adresy již nebude požadován. pokud se adresa jednou přeloží, nebude se již zkoušet v dalších podmínkách.
[R] (redirect) Dočasné přesměrování
[R=301] Trvalé přesměrování
[QSA] (query string append) Do výsledků se přidá i celý řetězec za otazníkem původního požadavku.
[NC] (no-case) Nerozlišovat velikost písmen - dobré například při přesměrování na jiný web.
Facebook Twitter Google+

Komentáře k článku "mod_rewrite a hezké url díl II"
Zobrazuji pouze posledních 30 komentářů.

Gravatar
Mike 30. 12 2010, 12:43
48/77 Čtvrtek 30. Prosince 2010, 12:43  |  Opera, Windows Vista

@: přesně naopak:

pod touto url:
mojadomena.sk/onas

by měl být vidět tuten soubor:
mojadomena.sk/onas.php

Gravatar
vert5 30. 12 2010, 12:45
49/77 Čtvrtek 30. Prosince 2010, 12:45  |  Opera, Windows Vista

A teda, resp. naopak to nemôže fungovať? :)

Gravatar
Mike 30. 12 2010, 12:47
50/77 Čtvrtek 30. Prosince 2010, 12:47  |  Opera, Windows Vista

a proč bys to proboha dělal naopak? :-) účelem "seo url" je právě se přípon souborů zbavit.

Gravatar
vert5 30. 12 2010, 12:51
51/77 Čtvrtek 30. Prosince 2010, 12:51  |  Opera, Windows Vista

Áno, už rozumiem, tým pádom musím všetky odkazy prebudovať na bez prípony? :)

Gravatar
Mike 30. 12 2010, 13:16
52/77 Čtvrtek 30. Prosince 2010, 13:16  |  Opera, Windows Vista

Ano, odkazy je nutné manuálně změnit. Což ale většinou nebývá takový problém, změníš pár řádků ve skriptu, který generuje menu. Horší je to v případě článků uložených v databázi, tam je bohužel potřeba to odkaz po odkazu upravit.

Gravatar
vert5 30. 12 2010, 13:57
53/77 Čtvrtek 30. Prosince 2010, 13:57  |  Opera, Windows Vista

Vďaka :)

Gravatar
Martin Kunšta 9. 3 2011, 00:52
54/77 Středa 9. Března 2011, 00:52  |  Chrome, Windows XP

Pěkný den,

použil jsem řešení z tvého webu, ale mám jeden problém. Nefunguje mi automatické přidání lomítka na konci adresy. Jsou to ty poslední dva řádky. Nejspíš je někde chybka a něco to blokuje. Byl bych vděčný za pomoc.

Můj .htaccess:

# mounttain.net/index.php > mounttain.net/
RewriteEngine On
RewriteRule ^index.php$ http://auto.mounttain.net/$1 [R=301]

Options -Indexes

# mujweb.cz/?page=neco > mujweb.cz/neco/
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?page=$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?page=$1&page2=$2

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)?/?/?$ ?page=$1&page2=$2&page3=$3

RewriteCond %{REQUEST_URI} !.[[:alnum:]]+$
RewriteRule ^(.+[^/])$ /$1/ [R=301]

Gravatar
Mike 11. 3 2011, 12:55
55/77 Pátek 11. Března 2011, 12:55  |  Opera, Windows Vista

@: Ahoj, přidávání lomítka na konec mi vždy dělalo problémy. Tu to fungovalo, tu ne. Jiný funkční zápis se mi vynalézt nepodařilo, takže lomítko teď doplňuji maximálně přímo v php. Asi bych to být tebou také neřešil.

Lépe neporadím, jak jsem říkal, dost to blbne.

Gravatar
Martin Kunšta 11. 3 2011, 16:52
56/77 Pátek 11. Března 2011, 16:52  |  Chrome, Windows XP

@: Já to naštěstí nepotřebuji nutně. Odkazy na webu uvádím s lomítkem na konci, jen jsem to chtěl mít pro úplnost funkční i takhle. Právě mě překvapilo, že když jsem přidal přepis pro 3 proměnné, přestalo to z ničeho nic fungovat. Jinak díky za odpověď ;)

Gravatar
miro 1. 4 2011, 13:48
57/77 Pátek 1. Dubna 2011, 13:48  |  Firefox, Windows Vista

da sa adresa domena.tld/?zobraz=kraj&ukaz=mesto upravena do peknej adresy domena.tld/kraj/mesto upravit aby to bolo oddelene pomlckou a nie lomitkom? takto domena.tld/kraj-mesto

som to skusal vsade upravovat... ale nejak neviem ako nato....

Dakujem

Gravatar
Jan 23. 12 2011, 02:19
58/77 Pátek 23. Prosince 2011, 02:19  |  Firefox, Windows XP

Zajímavý článek, ale mám problém s
/clanek.php -> /clanek/

z indexu se na stránku odkazuji takto: href="./sport.php"
chtel by jsem poté zobrazovat www.mojestranka/sport/
ale za boha se nedarí a pořád tam mám www.mojestranka/sport.php

vyzkousel jsem vsechny kody co jsou tady a pořád nic :(

Gravatar
Petr 13. 4 2012, 12:24
59/77 Pátek 13. Dubna 2012, 12:24  |  Mozilla, Symbian

Dobry den,
velice zajimavy clanek, ktery me primnel trochu se postourat ve svych strankach. Stranky jsou staticke, pouzivajici klasickou priponu html. Dle Vase prikladu mi to nyni funguje ve tvaru www.domena.cz/produkty/ ovsem , chtel bych docilit hlubsi struktury www.domena.cz/produkty/typ-produktu/produkt/ coz by odpovidalo variante se 4 promennymi. Ja si ale zadne parametry nepredavam,protoze nepouzivam php. Lze takoveto struktury vubec docilit u statickych stranek? Lamu si s tim hlavu, ale nemohu se posunout dal.

Dekuji za pomoc

Gravatar
Martin 9. 1 2015, 13:25
60/77 Pátek 9. Ledna 2015, 13:25  |  Chrome, Windows 7

Ahoj, skúšam podĽa Tvojho návodu pridať do .htaccess hezké URL, zatiaľ to mám takto:

V prvom príkaze mi "odtrhne" index.html a v durom príkaze som použil to na odstránenie .html.

# stranka.com/index.html > stranka.com/

RewriteEngine On
RewriteRule ^index.html$ http://onecreativeperson.com/$1 [R=301]


# stranka.com/nieco.html > stranka.com/nieco

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html


Čo všetko musím urobiť, aby mi to fungovalo na 100%? Treba niečo meniť aj v zdrojom html kóde, trebars presmerovania, alebo to urobí automaticky?

Ďakujem za odpoveď.

Gravatar
Mike 9. 1 2015, 14:17
61/77 Pátek 9. Ledna 2015, 14:17  |  Opera, Windows 8.1

ahoj, a teďka ti to nefunguje? mně se tam totiž moc nezdá ta druhá RewriteCond. sám bych použil pouze tohle :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1.html [L]

což vlastně udělá jen to, že při zadání www.neco.cz/stranka/ se reálně načte soubor www.neco.cz/stranka.html

žádné přesměrování, ty totiž mají tendenci blbnout. akorát odkazy v html pak musíš všude uvádět jako "www.neco.cz/podstranka/"

Gravatar
Martin 10. 1 2015, 18:20
62/77 Sobota 10. Ledna 2015, 18:20  |  Chrome, Windows 7

Ahoj, ďakujem Ti za odpoveď, skúsil som ten Tvoj príkaz, reálne funguje, lenže to robí neplechu, čo sa týka zobrazovanie css súborov. Proste to mám úplne ako jednoduché základné html, bez aplikovaných štýlov, nefungujú ani JS, čo je pochopiteľné, takže netuším, kde môže byť chyba.

Skúsil by si mi prosím poradiť ešte?

V súbore html som presmerovania nemenil, ale skúsim to, či to bude mať zmysel.

Martin.

Gravatar
Martin 10. 1 2015, 18:46
63/77 Sobota 10. Ledna 2015, 18:46  |  Chrome, Windows 7

Medzitým som prišiel na problém, že Tvoj upravený kód, ktorý si tu nedávno capol, nech ho skúsim, tak po presmerovaní na index mi hodí za doménu .html/

Nechápem, čím to môže byť, skúšal som aj meniť PHP verzie a ani to nepomohlo. Skúšal som takisto meniť aj cache, z http na debug a stále nič.

Gravatar
Mike 10. 1 2015, 19:41
64/77 Sobota 10. Ledna 2015, 19:41  |  Opera, Windows 8.1

ahoj, rozbité odkazy na styly a js opravíš přes <base href="http://neco.cz/" /> (do hlavičky) a ten redirekt indexu můžeš s klidným svědomím dát pryč :-) stačí prostě nedokazovat na index.html ale jen na "/" (resp. doménu)

Gravatar
Martin 10. 1 2015, 20:51
65/77 Sobota 10. Ledna 2015, 20:51  |  Chrome, Windows 7

A do koreňového súboru HTML mám dať celý odkaz, nie len odkaz z FTP?

niečo.html alebo http://www.stranka.com/nieco.html

Pretože ak by to tak fungovalo, bolo by to v pohode.

Ďakujem za odpoveď. :)

Gravatar
Mike 12. 1 2015, 09:07
66/77 Pondělí 12. Ledna 2015, 09:07  |  Opera, Windows 8.1

ahoj, nene, jakmile chceš přes htacess umazat html koncovku, pak i odkazy musí být už na novou strukturu url.

tedy <a href="http://www.stranka.com/nieco/">stranka<-;/a> atd. pod tímto linkem se tedy zobrazí nieco.html

můžeš také dát do hlavičky <base href="http://www.stranka.com/" /> a odkazy uvádět jenom relativně, jako <a href="nieco/">stranka</a> právě element base udělá to, že před všechny relativní odkazy přidá sám sebe.

Gravatar
Martin 30. 1 2015, 14:25
67/77 Pátek 30. Ledna 2015, 14:25  |  Chrome, Windows 7

Urobil som to presne podľa Teba, ale pri zadaní toho <base href="www.mojastranka.com"/> tie štýly vôbec nenačítalo, čomu absolútne nechápem.

Nevieš, čo s tým môže byť?

Ďakujem za odpoveď a prepáč, že sa ozývam až po tak dlhej dobe. :)

Gravatar
Martin 30. 1 2015, 14:29
68/77 Pátek 30. Ledna 2015, 14:29  |  Chrome, Windows 7

Opravil som to, ďakujem za pomoc. :-)

Čo som dlžný?

Gravatar
Mike 30. 1 2015, 16:08
69/77 Pátek 30. Ledna 2015, 16:08  |  Opera, Windows 8.1

ahoj, dobře, že se problém vyřešil. pokud si nejsi jistý, jak dát dokupy html odkazy + mod_rewrite, můžeš vždycky mrknout ke mně do zdrojáku, jak to tu mám řešené já.

"Čo som dlžný?"
když už se ptáš :-) pokud můj web doporučíš známym, budu rád :-)

Gravatar
Martin 31. 1 2015, 21:50
70/77 Sobota 31. Ledna 2015, 21:50  |  Chrome, Windows 7

Ahoj Mike,

tak je to poriešené, aplikoval som to aj na iný web, ale je tam jeden problém - ak otvorím podstránku www.neco.cz/o_nas.html tak mi to zobrazí ako www.neco.cz/o_nas/ ---> to je v poriadku. Ale akonáhle otvorím www.neco.cz/reference/ tak mi hodí chybu 403.

---------------------------------------------------

Forbidden

You don't have permission to access /referencie/ on this server.

---------------------------------------------------

Nevieš mi poradiť, čím to bude?

Vďaka.

Tvoju webstránku odporúčim známym aj kamarátom, nakoľko si cením Tvoju pomoc a ochotu, takisto Ti urobím aj reklamu na svojej vlastnej webstránke. :-)

Gravatar
Mike 1. 2 2015, 11:37
71/77 Neděle 1. Února 2015, 11:37  |  Opera, Windows 8.1

ahoj, 403 forbidden znamená, že lezeš do adresáře, který neobsahuje index. pokud máš na serveru složku "reference", tak má přednost před souborem "reference.html", který by se přepisoval na "reference/".

pravidlo v htaccessu je napsané tak, aby měly existující složky přednost.

a díky :-)

Gravatar
Martin 1. 2 2015, 18:51
72/77 Neděle 1. Února 2015, 18:51  |  Chrome, Windows 7

Ahoj,

som Ti maximálne zaviazaný, ďakujem za pomoc a trpezlivosť, pripadal som si ako totálny idiot.

Problém je vyriešený, vďaka Tebe. :-)

To propagovanie si zaslúžiš, takže nemáš za čo ďakovať. :-)

Gravatar
Miro 23. 3 2016, 11:34
73/77 Středa 23. Března 2016, 11:34  |  Chrome, MAC

Ahoj, kedysi som tu nasiel navod ako spravit pekne URL a teraz by som potreboval, aby keby ktosi zada adresu s lomitkom, nech ho presmeruje cez 301 na bez lomitka, vies mi poradit?
moj .htaccess vypada takto:

# defaultny startovaci subor
DirectoryIndex index.php index.html start.html


RewriteEngine on
Options +FollowSymlinks

####### Presmerovanie na verziu domény s www ######
RewriteCond %{HTTP_HOST} ^domena.sk
RewriteRule (.*) http://www.domena.sk/$1 [R=301,QSA,L]



######## PEKNE URL
####http://mike.treba.cz/mod_rewrite-a-hezke-url-dil-ii/
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?arg1=$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?arg1=$1&arg2=$2

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)?/?/?$ ?arg1=$1&arg2=$2&arg3=$3



### vynimky peknych url na adresare
RewriteRule ^admin/.*$ - [PT]

Gravatar
Mike 23. 3 2016, 12:24
74/77 Středa 23. Března 2016, 12:24  |  Opera, Windows 8.1

ahoj, no tohle už jsem dlouho nedělal :-) zkus toto (u mně funguje).

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,QSA,L]

Gravatar
Miro 24. 3 2016, 08:33
75/77 Čtvrtek 24. Března 2016, 08:33  |  Chrome, MAC

este mi skus povedat, ze kam to mam dat, aby to fungovalo a aj to co tam mam :)

Gravatar
Mike 24. 3 2016, 09:26
76/77 Čtvrtek 24. Března 2016, 09:26  |  Opera, Windows 8.1

dal bych to hned za přesměrování na www. nejdřív všechny redirekty, potom podstrčení.

Gravatar
Miro 24. 3 2016, 20:54
77/77 Čtvrtek 24. Března 2016, 20:54  |  Chrome, MAC

super! funguje to... diky :)

Celá diskuse

Přidat komentář







Nevím, kolik to je
Parak simati, Muballit mitte, Nergal allatu mellamu mesaru, La tapallah Annuaki, Kettu Puluthu qillatua