Autor Zpráva
TomasRe
Profil
Ahoj,
můžete mi prosím někdo poradit, co dělám špatně ohledně nastavení přátelské URL? Zkoušel jsem spousty návodů a nikdy se mi to bohužel nepodařilo. Obsah .htaccess (důležité jsou poslední dva řádky):

RewriteEngine On
RewriteBase /

# odstraní koncovku php
RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
RewriteRule (.*)\.php$ $1 [R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

RewriteRule ^lokalita/([^/]+)$ /lokalita.php?misto=$1 [L]
RewriteRule ^([^/]+)$ /novinka.php?id=$1 [L]

Pak by tedy místo odkazu na stránky
/lokalita?misto=XXX byl /lokalita/XXX
/novinka?id=XXX byl /XXX

Bohužel v obou případech se zobrazí chyba 404. Za jakékoliv rady budu moc rád. Díky...
Kajman
Profil
Díky pravidlu na řádku 9 se to přepíše na
lokalita/XXX.php
ten neexistuje, proto 404.

Je možné např. omezit pravidlo na řádku 9 tak, že nechcete převádět adresy s lomítkem
RewriteRule ^([^\./]+)$ $1.php [NC,L]

Nebo dáte nová pravidla před řádek 4.

Edit: ale pravidla z řádku 12 a 9 nelze používat souběžně. To, co bude dřív, to sežere a druhé podstrčení už nebude funkční.
TomasRe
Profil
Kajman:
Děkuju moc za info... Ještě prosím doplňující dotaz... Když tedy nepoužiju pravidlo pro odstranění koncovky a htaccess bude vypadat následovně:

RewriteEngine On
RewriteBase /

# odstraní index.php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)index\.php($|\ |\?)
RewriteRule ^ /%1 [R=301,L]

RewriteRule ^lokalita/([^/]+)$ /lokalita.php?misto=$1 [L]

Proč při zavolání URL lokalita/XXX (místo lokalita.php?misto=XXX) stále odkazuje na 404?
Kajman
Profil
Pomůže odstranit lomítko před lokalita.php? Soubor lokalita.php existuje?
TomasRe
Profil
Kajman:
RewriteRule ^lokalita/([^/]+)$ lokalita.php?misto=$1 [L]
Tohle bohužel nepomohlo... Jo, stránka lokalita.php existuje.
Kajman
Profil
V error logu apache je něco bližšího?

Na testovacím stroji je možné zapnout rewritelog pro ladění - způsob se liší dle verze apache (2.4 a 2.2)
httpd.apache.org/docs/current/mod/mod_rewrite.html#logging
httpd.apache.org/docs/2.2/en/mod/mod_rewrite.html#rewritelog


Edit: ještě mě napadají dva důvody:
- .htaccess není povolený - Řešení některých častějších problémů (FAQ) » Kterak ověřit, zda je rewrite povoleno a zapnuto
- existuje adresář lokalita, ve kterém je .htaccess, který přepíše rewrite pravidla z .htaccess v rootovském adresáři
TomasRe
Profil
Kajman:
Tak v logu není vůbec nic...

K těm dvou důvodům (snad se nepletu)
- pokud by nebyl htaccess povolený, tak by původně ani nemazal příponu .php
- v celé struktuře jiný .htaccess není
Kajman
Profil
Pokud v rewritelogu nic není, tak ta pravidla v .htaccess se asi vůbec neprochází. Ale to by neměl jít ani to ověření, zda je povolený z [#6].

Na testovacím stroji ještě můžete zkusit vypsat phpinfo a mrknout se v něm na cesty, zda vůbec a případně na co se to přepsalo

.htaccess
ErrorDocument 404 /phpinfo.php


phpinfo.php
<?php
phpinfo();
TomasRe
Profil
Kajman:
v PHP infor jsou všechny URL podle zadání htaccess v pořádku tedy lokalita/XXX

_SERVER["REDIRECT_URL"]
_SERVER["REQUEST_URI"]
_ENV["REDIRECT_URL"]
_ENV["REQUEST_URI"]
Kajman
Profil
Tak to právě v pořádku není. Pokud by zafungovalo dobře přepsání před rewriterule, bylo by v REDIRECT_URL lokalita.php.
TomasRe
Profil
Kajman:
Rozumím. Nějaký nápad proč to tak je? Každopádně moc děkuji.
Kajman
Profil
A už jste si konečně zkusil ověřit funkčnost mod_rewrite v tom .htaccess?
Řešení některých častějších problémů (FAQ) » Kterak ověřit, zda je rewrite povoleno a zapnuto

To že se předtím podstrkávaly jiné adresy neznamená, že to bylo nutně právě díky tomu .htaccess, který se snažíte upravit.

Pokud si funkčnost ověříte, dejte sem celý obsah .htaccess. Je možné, že se to tluče s něčím dalším.
TomasRe
Profil
Kajman:
Pro vyzkoušení funkčnosti jsem tedy zadal do .htaccess pouze toto

RewriteEngine On
RewriteRule .*   http://www.jakpsatweb.cz/ [L]

a přesměrovalo mě to... Nyní je obsah .htaccess:

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

Zatím na webu nic neměním (odkazy) - a zkouším to ručně přepsat tedy z URL /lokality/lokalita.php?misto=lom-borena-hora na /lokality/lokalita/lom-borena-hora - jen jestli ještě nemůžu dělat nějakou chybu já... Jinak v adresáři /lokality existují soubory index.php a lokalita.php
Kajman
Profil
Co ta cesta /lokality/ ? O té jste se nikdy nezmínil. Pokud je .htaccess v rootu webu, pak má být pravidlo
RewriteRule ^lokality/lokalita/([^/]+)$ lokality/lokalita.php?misto=$1 [L]
A zkontrolujte, že v adresáři lokality není jiný .htaccess (měl by přednost)

Pokud je .htaccess z [#13] v adresáři lokality, tak opravte
RewriteBase /lokality/
TomasRe
Profil
Kajman:
To jsem si nějak neuvědomil, že je to tak důležitý. Moc děkuju už to funguje. Jen se to nenačetlo se styly, ale počítám, že to je cestou, protože je tam o lomítko navíc :-). Ještě jednou strašně moc děkuji...


Kajman:
Ještě technický dotaz prosím - jak by to vypadalo, když by v URL bylo více proměnných? Něco ve smyslu lokality/lokalita.php?misto=XXXXX&neco=YYYYYY
Kajman
Profil
Jak se dá rozlišit, která část z url je první proměnná a která druhá?
Keeehi
Profil
RewriteRule ^lokality/lokalita/([^/]+)/([^/]+)$ lokality/lokalita.php?misto=$1&neco=$2 [L]
TomasRe
Profil
Kajman:
To je čistě teoreticky. Takže např. takto: lokality/lokalita.php?prvni=XXXXX&druha=YYYYYY


Keeehi:
A výsledná URL bude tedy lokality/lokalita/XXXYYYY nebo lokality/lokalita/XXXX/YYYY ?
Kajman
Profil
Výslednou URL si právě musíte navrhnout Vy a to tak, aby se daly jednotlivé parametry rozlišit (regulárním výrazem).

Keeehiho verze bude přepisovat URL ve tvaru lokality/lokalita/XXXX/YYYY

Také se dají nechat některé parametry v query stringu, pro zachování je však nutný flag QSA takže by se jen upravilo současné prvidlo
RewriteRule ^lokality/lokalita/([^/]+)$ lokality/lokalita.php?misto=$1 [L,QSA]
S tímto pravidlem by URL byla lokality/lokalita/XXX?neco=YYYY

Jsou i další možné url, jen si musíte vymyslet, kterou chcete používat a pak teprve podle toho psát pravidlo na přepis.
TomasRe
Profil
Kajman:
Rozumím. Opravdu moc děkuji za pomoc...
TomasRe
Profil
Kajman:
Moc se omlouvám, ale prosím ještě o radu... Myslel jsem, že jsem pochopil ty dva atributy, ale očividně ne. Jak by prosím vypadalo
přesměrování z URL /lokality/lokalita.php?misto=XXX&id=YY aby výsledná URL byla /lokality/misto-id ?

Už jsem na to přišel - všechno jste mi tu vlastně napsali... Ještě jednou moc díky oběma Kajman a Keeehi
Keeehi
Profil
Je dobré hlavně změnit oddělovač
RewriteRule ^lokality/lokalita/([^-]+)-([^/]+)$ lokality/lokalita.php?misto=$1&neco=$2 [L]
Kajman
Profil
Pokud má být na konci číslo, tak spíše

RewriteRule ^lokality/(.+)-([0-9]+)$ lokality/lokalita.php?misto=$1&id=$2 [L,QSA]
TomasRe
Profil
Kajman:
Můžu se ještě zeptat...?

Tento příklad nefunguje, když $1 je ve tvaru aaa-bbb (obsahuje více slov s pomlčkou), URL je pak aaa-bbb-123. Dá se to nějak ošetřit? Proměnná $1 může obsahovat jedno slovo, ale stejně tak i 5 slov...
Případně ještě druhý dotaz - pokud bych tedy zvolil výsledný tvar URL $1/$2 - přibude mi "cesta" - nevím jak to popsat - tváří se, jako by byl soubor v dalším podadresáři a tedy nevidí obrázky, styly a pod... Dá se to nějak jednoduše ošetřit, nebo musím všude přepsat cestu ../ na / ?
Kajman
Profil
TomasRe:
Tento příklad nefunguje, když $1 je ve tvaru aaa-bbb (obsahuje více slov s pomlčkou), URL je pak aaa-bbb-123.

Mně přijde, že to funguje.
htaccess.madewithlove.be?share=e3cfe010-d0a8-5c0b-8ba2-bd18b66340fe
Keeehi
Profil
TomasRe:
Dá se to nějak jednoduše ošetřit, nebo musím všude přepsat cestu ../ na / ?
Tak teoreticky můžeš použít jiný oddělovač než lomítko. Třeba podtržítko aaa-bbb_123. Mít ale zapsanou cestu od kořene je ale lepší nápad. Nebudeš pak muset nikdy řešit, co právě v url je.
TomasRe
Profil
Kajman, Keeehi:
Super. Teď už se s tím snad nějak poperu... Každopádně oboum strašně moc děkuji. Tohle je pro mě něco naprosto nového a bez vás bych to nedal dohromady. Ještě jednou opravdu moc díky.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: