Autor Zpráva
radekt
Profil
Dobrý den,
v .htaccess a v regulárních výrazech se nevyznám, a tak jsem hledal na webu radu kvůli chytrým adresám a použil tento tip:

RewriteEngine On
# přepis z /index.php?stranka=novinky na /novinky
RewriteRule ^([a-zA-Z0-9]+)$ /index.php?page=$1 [L,QSA]

Na stránkách mám php proměnnou $stranka, nikoli $page, přesto to funguje stejně, jako když dám:

RewriteRule ^([a-zA-Z0-9]+)$ /index.php?stranka=$1 [L,QSA]

Což je pro mně záhada, podle mně by varianta s page neměla fungovat. Nevíte někdo, proč tomu tak je?

To je ale jen první část záhady. V kódu mám tyto odkazy:
<!-- fyzicky stránka uvod.php -->
<li><a href="uvod">Úvod</a></li>
<!-- fyzicky stránka o_nas.php -->
<li><a href="o_nas">O nás</a></li>
<!-- fyzicky stránka kontakt.php -->
<li><a href="kontakt">Kontakt</a></li>


První a poslední odkaz mi funguje, prostřední ne. Problém je v podtržítku, když stránku přejmenuji na onas.php a v php kódu dám místo o_nas onas, je po problému. Nevíte někdo prosím, jak to zprovoznit pro stránku, která má v názvu podtržítko?
Děkuji
Radek Tůma
juriad
Profil
Zformátuj svůj příspěvek normálně.

Varianta s page by neměla fungovat; podle mě se vždy zobrazí stejná stránka, ať zadáš jakoukoli adresu.

Pravidlo:
RewriteRule ^([a-zA-Z0-9]+)$ /index.php?page=$1 [L,QSA]
Udělá toto:
1) Pokud adresa stránky začíná (vyjádřeno znakem ^) skupinou (vyjádřeno závorkami) jednoho a více (vyjádřeno tím plusem) znaků zapsaných výčtem (vyjádřeno hranatými závorkami), který obsahuje malá písmena anglické abecedy (a-z), velká písmena anglické abecedy (A-Z) a čísla (0-9), a tím pak adresa končí (vyjádřeno znakem $).
2) Zapamatuj si část adresy, která je v závorkách.
3) Začni vytvářet novou adresu jako /index.php?page=první zapamatovaná část.
4) Pokud měla původní adresa nějaké parametry za otazníkem (?param1=hodnota1&param2=hodnota2), tak je přidej k nové adrese (to dělá to QSA) a toto je poslední pravidlo, které se má provést (to dělá to L).
5) Zobraz stránku s novou adresou.

Projdi si odkazy v pravo, v sekci Mohlo by se hodit. Je to tam podrobmě popsáno.

Řešením je přidat podtržítko do výčtu povolených znaků:
^([a-zA-Z0-9_]+)$
Nebo rovnou povolit úplně všechny znaky:
^(.*)$
kde tečka znamená „cokoli“ a hvězdička „opakováno libovolněkrát“.
Kajman
Profil
radekt:

[a-zA-Z0-9] změňte na [a-zA-Z0-9_-] a půjdou podržítka i pomlčky (které se doporučují používat raději než podržítka).

A jak plníte proměnnou $stranka tušit bez kódu nemůžeme.

juriad:
Nebo rovnou povolit úplně všechny znaky

Bez ošetření by se začaly přepisovat i obrázky, styly atp.
juriad
Profil
radekt:
# přepis z /index.php?stranka=novinky na /novinky
On je ten přepis přesně opačně:
Kdykoli zadám novinky, zobrazí se stránka (přepíše se skrytě adresa na) /index.php?stranka=novinky.
Tedy server přepisuje příchozí adresy na takové kterým pak PHP rozumí.

Kajman:
Díky za upřesnění.

Ta podmínka by pak byla:
#ignoruj vsechny opravdove adresare
RewriteCond %{REQUEST_FILENAME} !-d
#ignoruj vsechy opravdove soubory (php skripty, obrazky, styly)
RewriteCond %{REQUEST_FILENAME} !-f
(viz Řešení některých častějších problémů (FAQ) » Univerzální obecné pravidlo)
radekt
Profil
Děkuji moc za radu a vysvětlení. První varianta RewriteRule ^([a-zA-Z0-9_-]+)$ /index.php?page=$1 [L,QSA] funguje i se špatnou proměnnou (divné, ale je to tak), druhá RewriteRule ^(.*)$ /index.php?stranka=$1 [L,QSA] ne (i když jsem tam opravil proměnnou na stranka). Vrací 500 Internal Server Error.

Když jsme u té hvězdičkové konvence, dalo by se místo
# přesměrování webu s WWW na verzi bez WWW
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.konkretni-stranka\.cz [nc]
RewriteRule (.*) http://konkretni-stranka.cz/$1 [R=301,L]

použít něco takového:
# přesměrování webu s WWW na verzi bez WWW
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.^(.*)$\.cz [nc]
RewriteRule (.*) http://^(.*)$/$1 [R=301,L]

jako univerzální řešení pro jakoukoli stránku?
juriad
Profil
radekt:
Hlavně, že to nějak funguje. Ukaž celý soubor .htaccess.

Ano, můžeš, ale netahej tam ty znaku ^$, které slouží pro popis začátku a konce textu, kterému má regulární výraz vyhovovat.
Snad by mohlo fungovat toto (nemám s tím přílíš zkoušenosti):
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*) [nc] #kdykoli doména začíná čtyřmi znaky „www.“ (pozn), zapamatuj si zbytek domény
RewriteRule (.*) http://%1/$1 [R=301,L] # přesměruj každou takovou stránku ($1) na zapamatovanou doménu (%1)

pozn: před tečkou musí být lomítko, protože jinak má tečka význam jakéhokoli znaku. Přesměrovalo by to tedy třeba:
wwwsnadno.cz na nadno.cz, (znak s by byl požrán tou tečkou), což není to co bys chtěl.

Ale jelikož máš téměř jistě jen jednu doménu, nepotřebuješ to řešit takto obecně.
radekt
Profil
juriad:
No to je paráda, děkuji mockrát! Takže tohle mi z toho s laskavou pomocí vás všech vyšlo:

RewriteEngine On
# přesměrování webu s WWW na verzi bez WWW
# kdykoli doména začíná čtyřmi znaky „www.“ (pozn), zapamatuj si zbytek domény
RewriteCond %{HTTP_HOST} ^www\.(.*) [nc]
# přesměruj každou takovou stránku ($1) na zapamatovanou doménu (%1)
RewriteRule (.*) http://%1/$1 [R=301,L]
# přepis z /novinky na /index.php?stranka=novinky
# po zadání novinky se zobrazí stránka (adresa se přepíše skrytě na) /index.php?stranka=novinky. 
# tedy server přepisuje příchozí adresy na takové, kterým pak PHP rozumí.
# ve výčtu jsou podržítka i pomlčky pro adresy, které by je obsahovaly 
RewriteRule ^([a-zA-Z0-9_-]+)$ /index.php?stranka=$1 [L,QSA]

Druhá varianta - povolení všech znaků v kombinaci s univerzálním obecným pravidlo také šlape jako hodinky. Je to jedno, jakou variantu zvolím nebo která je případně obecnější a lepší?
juriad
Profil
Raději použij toto. Jak zmínil Kajman, musel bys přidat podmínku, aby to nepřepisovalo adresy stylů, skriptů (JS) a obrázků. Lepší je tedy přepsat jen to, u čeho jsi si jistý, že vede na stránku (za doménou jsou jen písmena, čísla a podtržítko a pomlčka), nikoli tečka (ta v tom výčtu není).
radekt
Profil
Ještě jednou mockrát děkuji, jste skvělí.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0