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 |
#2 · Zasláno: 17. 1. 2015, 09:11:51
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] 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¶m2=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_]+)$ ^(.*)$ |
||
Kajman Profil |
#3 · Zasláno: 17. 1. 2015, 09:14:45
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 |
||
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 |
#6 · Zasláno: 17. 1. 2015, 09:49:36
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 |
#7 · Zasláno: 17. 1. 2015, 10:12:05
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 |
#8 · Zasláno: 17. 1. 2015, 10:18:30
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 |
#9 · Zasláno: 17. 1. 2015, 10:26:10
Ještě jednou mockrát děkuji, jste skvělí.
|
||
Časová prodleva: 10 let
|
0