www.SAMURAJ-cz.com 

15.12.2017 Radana a Radan Translate to English by Google     VÍTEJTE V MÉM SVĚTĚ

Články

Pěkné adresy aneb Cool URI aneb Apache mod_rewrite

Středa, 29.11.2006 17:05 | Samuraj - Petr Bouška |
Pokud adresa určité stránky na webu má pěkný a informačně bohatý tvar, tak je jistě zajímavá pro uživatele, ale stejně tak je důležitá pro vyhledávače. Vhodnému tvaru adresy se říká Cool URI a k jeho dosažení na serveru Apache můžeme využít (například) modul mod_rewrite (plus patřičné vědomosti). V tomto článku jsem se pokusil popsat můj osobní pohled na "dobré" adresy webových stránek s náznaky řešení a popisem základů mod_rewrite.

Co je to URL, URI, URN

Na webu se najde mnoho diskuzí a vysvětlení těchto termínů. Sám jsem si nebyl jist přesným rozdílem mezi URL a URI a proto jsem hledal po internetu. Nakonec jsem skončil u definice, která je uvedena v RFC3986. Podle toho co se zde píše, jsem pochopil, že mezi URI a URL není výrazný rozdíl (většinou je možno použít oboje označení), ale doporučuje se spíše používat termín URI.

URI je zkratka pro Uniform Resource Identifier, tedy jednotný identifikátor zdroje. URI je členem univerzální skupiny jmen v registrovaném jmenném prostoru a odkazuje na registrovaný protokol nebo jmenný prostor. Jedná se o standard pro určení (identifikaci) objektu (zdroje) typicky na internetu. Běžně se skládá z určení schéma přístupu (protokolu), adresy zařízení (počítače), cesty k objektu a jeho jména. Někdy také může obsahovat uživatelské jméno, heslo, port, dotazový řetězec (query string).

Př.: http://www.samuraj-cz.com/, mailto:John.Doe@example.com, ftp://ftp.samuraj-cz.com:21/web/index.php

URL je zkratka Uniform Resource Locator, což můžeme přeložit jako jednotný lokátor (poloha) zdroje. URL je podmnožinou URI.

Méně běžný je termín URN, tedy Uniform Resource Name, jednotné jméno zdroje. Určuje zdroj, bez přesného umístění.

Jak vypadá Cool URI?

Předem bych chtěl poznamenat, že následující popis vychází z mých názorů, zkušeností a praxe. Myslím, že žádná obecná definice pro Cool URI neexistuje. V mém pohledu je Cool URI silně spojeno se SEO.

Cool URI můžeme popsat několika vlastnostmi, které by mělo dodržovat. Následuje seznam těchto vlastností, některé jsou více a jiné méně důležité.

URI (adresa) dokumentu by se nikdy nemělo měnit. Teoreticky to vypadá, že to tak je stále, ale v praxi nastává mnoho důvodů, kdy k tomu musí dojít. Například při změně programovacího jazyka (změna html na php) nebo změně redakčního systému. Problém, i budoucí, změny programovacího jazyka, potažmo přípony, můžeme řešit dvěma způsoby. (1) I dokumentům v jiných jazycích (například v PHP) se nastaví přípona .html. (2) Nebo se nepoužije přípona žádná (www.mujweb.cz/o-nas). Pak zbývá otázka, zda ukončovat adresu lomítkem (www.mujweb.cz/o-nas/) či nikoliv. V obou případech je ovšem dobré, aby fungovala adresa s lomítkem i bez, ale k dokumentu vedla pouze jedna cesta (tento důvod plyne z dalšího bodu), to se řeší pomocí přesměrování.

Navazujícím pravidlem je, že každý dokument na webu by měl být jednoznačně adresovatelný. To znamená, aby se na daný dokument nedalo dostat pomocí více adres. Běžně můžeme použít adresu webového serveru s www na začátku (www.mujweb.cz/autor/) nebo bez něj (mujweb.cz/autor/). Potom vyhledávače indexují každou stránku s dvěmi adresami a tak dělí ohodnocení. Lepší je vybrat jednu variantu a tu druhou na tuto přesměrovávat se správným návratovým kódem.

URI by mělo obsahovat nějakou sémantiku, abychom poznali, co se nalézá v dokumentu. Proto se také říká uživatelsky přátelská (user-friendly) URI. I přesto, že asi nikdo nezadává celou adresu k dokumentu ručně, je přehlednější, když je "čitelná" a víme, kde se nacházíme. Také proto nemusí vadit, když je adresa delší. Nejvíce je to viditelné u webů, které obsahují různé články (nebo třeba u elektronických obchodů), každý článek z databáze může být adresován například takto www.mujweb.cz/clanky.php?id=123 nebo pomocí Cool URI www.mujweb.cz/clanky/Jak-na-html. Také vyhledávače lépe indexují adresy, které obsahují klíčová slova. V tomto případě zbývá jedna programátorská otázka, a to jak jednoznačně identifikovat článek z této adresy, takže se buď využije jména dokumentu (řetězce) nebo se, třeba na začátek jména, vloží ID článku (většinou číslo).

adrese je však důležité nejen jméno dokumentu, ale také cesta k tomuto dokumentu. Tato cesta nemusí odpovídat fyzickému umístění dokumentu, ale spíše logickému umístění ve struktuře webu. Když vhodně zvolíme tuto strukturu, můžeme hodně získat. Například můžeme cestu k článku strukturovat www.mujweb.cz/sekce/podsekce/dokument. Následně je pak třeba ošetřit, co se stane po umazání některé části. Určitě je lepší, když se po smazání jména článku zobrazí seznam všech článků z dané kategorie než chybová stránka. Upřímně si sice myslím, že příliš uživatelů takto nepostupuje, ale někteří ano.

Mezi drobnější pravidla patří nepoužívat query stringy. Nevypadá to příliš hezky a pro neznalého uživatele je to spíš zmatečné. Přitom v praxi je můžeme jednoduše nahradit jiným způsobem adresy. Například stránkování www.mujweb.cz/show.php?page=2 můžeme nahradit za www.mujweb.cz/show/page2/.

V adrese by nemělo být relatiní určení času, protože to je jen krátkodobě platné (dnes, letos).

Pro oddělení dvou slov používejte pomlčku, místo mezery, (jak-na-html), pro spojení dvou slov podtržítko (mod_rewrite).

Apache mod_rewrite

Mod_rewrite je velice silný nástroj, který slouží k manipulaci s URI - dokáže je za běhu přepisovat. Nejčastěji se využívá pro přesměrování nebo podstrčení (tento termín používá například Yuhů a připadá mě výstižný) stránky. Ale můžeme jej použít i pro řadu dalších situací. Například pro jednoduchý load balancing, kdy příchozí adresy třídíme podle zdrojové IP adresy a posíláme na různé servery.

Na webu existuje řada popisů tohoto modulu, z česky psaných doporučuji Yuhův článek. Já přesto popíši základy, ale pro podrobnější informace doporučuji různé zdroje uvedené v odkazech.

Princip je takový, že vytváříme pravidla, která se uplatní za určité podmínky na zadanou vstupní adresu a změní ji na jinou (klidně dynamickou). Pro popis se využívají regulární výrazy. Ač někteří tvrdí opak, já si myslím, že základy regulárních výrazů nejsou složité a jedná se o velmi silný aparát, který můžeme využít na mnoha místech (složitější vyhledávání, hromadné přejmenování, generování skriptů, kontrola formátu). Pro ty, kdo se v tomto tématu neorientují, doporučuji články v odkazech.

Pozn.: ne vždy je třeba pro přesměrování použít mod_rewrite, pro jednoduché přesměrování můžeme použít příkaz headerPHP nebo meta tag  refresh v HTML. Další možností je využít chybovou stránku 404 nebo modul mod_alias. Ale pokud máme mod_rewrite k dispozici, máme nejuniverzálnější nástroj.

Hned na začátku bych chtěl upozornit, že pokud uděláte zásadnější chybu v souboru .htaccess (a to se vám skoro určitě povede), projeví se to tím, že místo volané stránky dostanete chybu serveru 500 ServerError. Může to být způsobeno například cyklem. Potom zkuste třeba zakomentovat poslední změny v tomto souboru a uvidíte, zda chyba přetrvá.

Zapnutí modulu

Standardně se tento modul instaluje s http serverem Apache, ale není zapnutý. Proto je třeba upravit soubor httpd.conf a (ve většině případů) odkomentovat dva řádky (odstranit znak #):

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

Pokud definujeme pravidla v souboru .htaccess a tudíž se uplatňují per-adresář, musí být pro daný adresář zapnuto Options FollowSymLinks!

Obecně o zápisu mod_rewrite

Pravidla pro mod_rewrite můžeme psát buď do hlavního konfiguračního souboru httd.conf nebo (běžněji) do souboru .htaccess, který umístíme do podadresáře, od kterého včetně a níže se mají uplatnit uvedená pravidla (většinou root webu).

# je znak pro komentář

Na začátku musíme zapnout přepisování pomocí zápisu

RewriteEngine on

Hlavní příkaz pro zápis pravidel je

RewriteRule {schéma - pattern} {nahrazení (podstrčení) - substitution} [příznaky - flags]
  • schéma je regulární výraz, který popisuje vstup, na který se má pravidlo uplatnit, tedy to na co se klient ptá (většinou neexistující adresa)
  • subatituce je adresa, na kterou se vstup přepíše, tedy to co klient dostane (to už by existovat mělo), můžeme zde využívat také různé proměnné nebo hodnoty ze schématu
  • příznaky určují speciální chování daného pravidla, je jich celá řada, zadávají se do hranatých závorek a oddělují čárkou, mezi hlavní patří:
    • L – last rule – poslední pravidlo, standardně se procházejí všechna pravidla a uplatní se každé, kdy vyhovuje schéma, proto je často vhodné použít tento příznak, jinak vznikají složité situace
    • R – redirect – změna adresy se provede jako přesměrování, můžeme se doplnit i návratovým kódem 300 až 400 (301 trvalé přesměrování, 302 dočasné přesměrováni, atd.)
    • F – forbidden – zákaz přístupu na stránku
    • QSA – query string append – do substituce se přidají GET parametry ze schématu, místo, aby se nahradily

Pokud se použije přesměrování [R] změní se zobrazená adresa v prohlížeči na nahrazenou. Při nepoužití tohoto příznaku se provede podstrčení. Obsah je z nahrazené adresy, ale v prohlížeči se zobrazuje původní (zadaná) adresa.

Ve schématu se nepoužívá adresa serveru, ale až další část. Pokud použijeme na začátku znak / (kořen) nebo proměnnou %{DOCUMENT_ROOT}, vztahuje se adresa ke kořeni webu, jinak je adresa relativní k adresáři, kde se nachází soubor .htaccess. U přesměrování musí být vždy absolutně. Pokud v substituci použijeme prefix http://tento-server[:port] (tedy aktuální adresu serveru), tak se zahazuje. V substituci můžeme použít i absolutní adresu, ale pak se vždy použije přesměrování.

# Příklad:
RewriteEngine on
RewriteRule   a\.html   /b.html   [R]
# Volání a.html kdekoliv na webu (v podadresářích) převede na b.html (v rootu webu), provede 
# přesměrování, takže se změní adresa v adresním řádku, když vynechám [R], tak se nebude měnit adresa.

Dalším příkazem je

RewriteCond {testovací řetězec} {vzor podmínky}

Zapisuje se před RewriteRule a potom se daný RewriteRule uplatní pouze v případě, že je podmínka platná. Jako testovací řetězec může být text, serverové proměnné nebo zpětné odkazy. Vzor podmínky je regulární výraz, který se porovnává s řetězcem.

Existuje ještě několik dalších příkazů. Zajímavým, ale složitějším, je příkaz RewriteMap, kdy můžeme použít mapovací tabulku nebo funkci (v externím souboru) pro nahrazování uvnitř RewriteRule. Například se náhodně přiřazují různé cílové servery pro load balancing. Toto řešení je také vhodné pro nahrazování velkého množství adres jinými adresami, je to rychlé a dobře se udržuje, protože seznam je textový soubor.

Příklady z praxe

# Normální stránka
RewriteRule ^chyba/?$ /chyba.php [L,QSA]

# Dvě možnosti pro přepis RSS
RewriteRule ^rss/$ /rss/rss.php [L]
RewriteRule ^rss/rss\.xml$ /rss/rss.php [L]

# Řešení článků s kategorií a stránkováním (je možno zapsat i do jednoho řádku)
RewriteRule ^clanky/strana([0-9]*)/?$ /clanky.php?page=$1 [L,QSA]
RewriteRule ^clanky/([^/]*)/strana([0-9]*)/?$ /clanky.php?category=$1&page=$2 [L,QSA]
RewriteRule ^clanky/([^/]*)/?([^/]*)/?$ /clanky.php?category=$1&name=$2 [L,QSA]

# Přepis adresy bez www na www
RewriteCond %{HTTP_HOST} ^samuraj-cz\.com
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ http://www.samuraj-cz.com/$1 [R=301,QSA]

# Ukončení adresy lomítkem
RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteRule ^(.+[^/])$ /$1/ [R=301]

Užitečné odkazy

zobrazeno: 41157krát | Komentáře [41]

Autor:

Související články:

Moderní web

Webové stránky se dají dělat různě, pokud však nebudeme dodržovat současné principy a standardy, tak patrně nebudou příliš oblíbené.

Pokud se Vám článek líbil, tak mne potěšíte, když uložíte odkaz na některý server:

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže. Pokud chcete poradit s nějakým problémem či diskutovat na nějaké téma, tak použijte fórum.

Komentáře

  1. [1] Petr

    Díky za článek, až tady jsem konečně našel to co jsem potřeboval!

    Petr

    Středa, 20.12.2006 09:24 | odpovědět
  2. [2] mtommy

    Dobrý den,

    potreboval bych kdyz zadam do prohlizece http://domena.cz aby mi to podhodilo strnku z http://domena.cz/neco pritom v adresnim radku zustalo http://domena.cz . Uz se na to snazim prijit nekolik veceru a nemuzu na to prijit

    Úterý, 19.06.2007 00:23 | odpovědět
  3. [3] Samuraj

    odpověď na [2]mtommy: No jestli jsem to dobře pochopil, tak je to jednoduché.

    RewriteRule ^$ /neco.php [L,QSA]

    Úterý, 19.06.2007 08:26 | odpovědět
  4. [4] reset

    Dobrý den, mohl bych se zeptat, když všude používám (v odkazech) index.php?sekce=a_neco, tak jak mám udělat aby se tedy automaticky zmenila adresa na ../a_neco/? A když někdo nakonci umaže lomítko, tak lze to nějak ošetřit aby to šlo i bez něj? Jinak vše testuji na localhostu (přes EASYPHP).

    Děkuji předem za odpověď.

    Pátek, 10.08.2007 22:08 | odpovědět
  5. [5] Jindra

    Zdravím,

    udělal jsem si podle Vašeho návodu jednoduchou aplikaci, kde mi vypisuje aktuality.

    .htaccess mám takto:

    RewriteEngine on

    RewriteRule ^test/([^/]*)/?([^/]*)/?$ test.php?id=$1&a=$2 [L,QSA]

    Nemohl byste mi poradit jak mám udělat abych se mi automaticky dělaly odkazy s těmi lomítky, nebo si to musím sám všude dělat ručně (Nebo jak to máte udělané na vašem webu?)?

    Další věc je ta... chtěl bych aby se místo test/15(id aktuality)/, zobrazoval místo toho id nadpis te aktuality,ale nevím jak to udělat (+ mezery v nadpisu a háčky a čárky jak vyřešit).

    Byl bych Vám velmi vděčný kdyby jste mi poradit, opravdu nevím co stim.

    Děkuji.

    S pozdravem jindra

    Pátek, 10.08.2007 23:33 | odpovědět
  6. [6] Samuraj

    odpověď na [5]Jindra:

    Nejprve je třeba si uvědomit, co přesně dělá uvedené pravidlo:

    pokud přijde dotaz na stránku s adresou nějak jako http://www.mujweb.cz/aktualita/ID/parametr-a/ (nebo podobně, třeba i bez parametr-a), tak nehledá tuto stránku ve vašem zdroji, ale hledá stránku aktuality.php?id=ID&a=parametr-a (pokud by nebyli zadány parametry, tak hodnota je prázdná).

    Takže, aby to fungovalo, musíte přeprogramovat své stránky tak, že místo původních odkazů (které asi byli aktuality.php?id=ID&a=parametr-a) se všude použijí odkazy právě s těmi lomítky /aktualita/ID/parametr-a/. K tomu bych upozornil, že je dobré používat absolutní odkazy (tedy /aktuality/něco) a ne relativní (jako aktuality/něco).

    Co se týče používání nadpisů místo ID aktuality:

    Jak píši v článku je několik možností. Důležité je, že název musí být unikátní, aby se mohl odlišit daný článek. Někdo to dělá tak, že k názvu přidá i ID, já používám pouze název, ale kontroluji unikátnost. Nedoporučuje se, aby v adrese byli mezery a české znaky. Moje použití je, že když vkládám článek, tak si jednoduchým JavaScriptem převedu nadpis na tvar adresy (odstraním diakritiku a mezery nahradím -). Tento odkaz zkontroluji a pak se uloží do DB spolu s článkem. Potom jej používám při hledání článku nebo při vytváření odkazu.

    Neděle, 12.08.2007 15:55 | odpovědět
  7. [7] Samuraj

    odpověď na [4]reset: Toto je podobné jako moje předchozí odpověď, ale zkusím to ještě více popsat.

    Přepis adres pomocí mod_rewrite dělá to, že máme pěkný odkaz a on jej převede na normální adresu souboru (případně s parametry). Takže jména souborů mohou zůstat jako dříve (oni by ani většinou nešli upravit tak, jak jsou v pěkných odkazech), ale všude na webu musím upravit odkazy do pěkného tvaru, to mě mod_rewrite neudělá (je to opak než dělá on).

    Ošetření, když někdo zadá adresu bez posledního lomítka nebo s lomítkem, je možné třeba tím, že všechny adresy, které lomítko nemají přepíšu na adresu s lomítkem:

    RewriteCond %{REQUEST_URI} !.[[:alnum:]]+$

    RewriteRule ^(.+[^/])$ /$1/ [R=301]

    Neděle, 12.08.2007 16:02 | odpovědět
  8. [8] Jindra

    Dobře, děkuji moc

    A mohl bych se ješte zeptat, jde nějak udělat aby pořád dokola nemusel vypisovat

    RewriteRule ^uvod/([^/]*)/?([^/]*)/?$ index.php?page=uvod [L,QSA]

    ke každé stránce zvlášť, ale aby nějak se dalo místo uvodu $1 a fungovalo by to automaticky? Zkoušel jsem to a nefungovalo to...

    A poslední věc... jak jste mi poradil abych používal spíše absolutní odkazy, tak když je tam zadam, tak mi to bere od kořene (localhostu... použivam easyphp) nebo jak to nazvat. Takže musím nastavit rovnou cestu i k me složce? Takto /mujweb/kontakt/ ? Když dám jen /kontakt/ tak mi ukaze v adrese ip a hned zatim /kontakt/.

    Děkuji předem za odpověď a omlouvám se že Vás vyrušuji. Jinak si velmi cením, že mi odpovídáte, rád chodím na Váš web!

    Neděle, 12.08.2007 16:34 | odpovědět
  9. [9] Jindra

    Tu první věc jsem už vyřešil ted ješte tuto

    A poslední věc... jak jste mi poradil abych používal spíše absolutní odkazy, tak když je tam zadam, tak mi to bere od kořene (localhostu... použivam easyphp) nebo jak to nazvat. Takže musím nastavit rovnou cestu i k me složce? Takto /mujweb/kontakt/ ? Když dám jen /kontakt/ tak mi ukaze v adrese ip a hned zatim /kontakt/.

    Neděle, 12.08.2007 16:51 | odpovědět
  10. [10] Samuraj

    odpověď na [8]Jindra: Zmíním se i o první otázce:

    Je možné udělat pravidlo

    RewriteRule ^([^/]*)/?$ /index.php?page=$1 [L,QSA]

    Ale pak bude vše směrováno na stránku index.php a pokud bych chtěl něco jiného poslat třeba na aktuality.php, tak je to problém. Samozřejmě to jde řešit tím, že před toto pravidlo vložíme jiné, třeba

    RewriteRule ^aktualita/([^/]*)/?$ /aktuality.php?i=$1 [L,QSA]

    Díky tomu, že to bude první pravidlo, které bude sedět vstupu a na konci je L (nebude se pokračovat v hledání), tak to bude fungovat.

    Neděle, 12.08.2007 18:30 | odpovědět
  11. [11] Samuraj

    odpověď na [9]Jindra: Když se používá mod_rewrite, tak někdy špatně fungují relativní odkazy, proto je jistější používat absolutní.

    Samozřejmě, pak je adresa absolutně od kořene webu. V případě lokálu se jedná o DocumentRoot. Pokud tam máte víc podadresářů s různými projekty, tak by se musela uvést cesta včetně složky, ale pak by byl problém, když by to člověk dal na ostrý web. Já to dělám tak, že si upravuji v httpd.conf cestu k DocumentRoot podle toho, na kterém projektu pracuji. Pak je to root. A třeba pro přístup k některým dalším adresářům používám aliasy.

    Neděle, 12.08.2007 18:36 | odpovědět
  12. [12] Jindra

    Skvělé děkuji Vám moc za rady, jen mám tu poslední věc kterou prostě nevím jak vyřešit. Mám vše stránky v složce include/ kromě tedy indexu (u indexu mám také .htaccess), styly mám ve složce /css/css.css. Nevím z jakého důvodu se mi u stránek když je tedy nechám zobrazit odkazem /aktuality/ ( normalne je to index.php?page=aktuality ),tak se mi tam nenactou styly ani obrazky. Nevíte jak to vyřešit?

    Nechci to řešit tím že před každý obrázek a cestu ke stylu dám ../, potom to jde, ale nejde to nějak jinak?

    Díky

    Úterý, 14.08.2007 00:47 | odpovědět
  13. [13] Samuraj

    odpověď na [12]Jindra: Nevím, jestli to dobře chápu. Každopádně odkazy uvnitř zdrojových souborů musí používat strukturu adresářů na serveru. Nezáleží na tom, zda se používá mod_rewrite či ne.

    Úterý, 14.08.2007 12:36 | odpovědět
  14. [14] Samuraj

    odpověď na [12]Jindra: A ještě jedna poznámka. Soubor .htaccess se aplikuje na aktuální složku a všechny podsložky. Takže pokud nechci někde něco nastavit jinak, tak se používá jeden soubor .htaccess a ten se uloží do rootu webu.

    Úterý, 14.08.2007 12:42 | odpovědět
  15. [15] Jindra II.

    odpověď na [12]Jindra: Pokud jsem správně pochopil Jindrův problém, upozorňuje na něj Yuhů www.jakpsatweb.cz/server/mod-rewrite.html - hledej: "Bacha na interpretaci cest".

    Úterý, 21.08.2007 01:03 | odpovědět
  16. [16] Drobek

    odpověď na [7]Samuraj:

    Nevedel by nahodou nekdo proc pridani lomitka nezafunguje napr. u:

    http://domena.cz/kategorie-pl175

    Dekuji

    Pátek, 19.10.2007 12:48 | odpovědět
  17. [17] Samuraj

    odpověď na [16]Drobek: No řekl bych, že problém bude někde u tebe, pokud jsi použil ten kód co mám v článku.

    Pokud to zkusíš u mě, tak to chodí (doplní to lomítko, ale nenajde článek):

    www.samuraj-cz.com/clanky/webdesign/kategorie-pl175

    Pátek, 19.10.2007 13:06 | odpovědět
  18. [18] Drobek

    odpověď na [17]Samuraj: Opravdu chyba u me - diky

    Pátek, 19.10.2007 14:37 | odpovědět
  19. [19] Pseudo

    měl bych otázku

    Jak by se dala pomocí mod_rewrite realizovat stromová struktura kategorií článků (tedy například /clanky/zazitky/zdomova/rodina/nevimcojeste/9-tady-je-clanek)?

    Problém vydím hlavně v ověřování jednotlivých subkategori. Asi bych to musel celé přesměrovat na jednu adresu

    např

    RewriteRule ^clanky/([^\s]+)/(([0-9]+)-([^\s]+))$ ?str=clanky &kat=$1&id=$2&clanek=$3 (ten regulár je asi blbě, ale to není podstatné)

    a následně v PHP ty kategorie pomocí eplode rozsekt, ověřit a náseldně zobrazit článek?

    Stromová struktura by se mi totiž celkem hodila, ale nevým, jestli to není nad moje síly (PHP se učím cca 2 měsíce)

    Neděle, 03.02.2008 00:25 | odpovědět
  20. [20] Pseudo

    BTW: Jak si to tak čtu nyní, tak se musím omluvit za svůj pravopis. Asi bych po půlnoci neměl nikam postovat :-(

    Neděle, 03.02.2008 10:32 | odpovědět
  21. [21] Samuraj

    odpověď na [19]Pseudo: Já třeba tady používám malou stromovou strukturu s pevnou délkou (články - kategorie). Myslel jsem, že to bude přehlednější, dá se procházet do daných kategorií, ale zjistil jsem, že na to lidi nekoukají a jen to prodlužuje adresu.

    Pokud má být hloubka struktury proměnná, tak je to složitější. Možná by to šlo, jak píšeš. Ale je asi dost těžké napsat správný regulární výraz (ten co jsi napsal to podle mne nebude). Normálně se pozná ukončení podle /, ale pokud by měl několik přejít a na posledním se zastavit ...

    Nebo si určit maximální počet úrovní a všechny tam ručně zadat do parametrů (ty co tam nebudou v adrese, tak budou prázdné).

    Neděle, 03.02.2008 12:03 | odpovědět
  22. [22] Honza198

    Potřeboval bych něco, jste tu psal "název strnky" (přesněji URL) z odpisu stránky. Jak udělám, to se stroj (apache) podíval do BD ještě před načtením stránky.

    Tzn. když budu mít adresu ve tvaru:

    http://www.spartafans.xf.cz/rozhovory.php?date=1201111487

    a chtěl bych aby tam bylo:

    http://www.spartafans.xf.cz/rozhovory/rozhovor-s-povidlakem

    (jako je nadpis)

    Děkuji

    Pondělí, 04.02.2008 08:03 | odpovědět
  23. [23] Samuraj

    odpověď na [22]Honza198: Řekl bych, že to v článku bude popsáno, ale už je dlouho co jsem ho psal.

    Apache se do DB nedívá a ani to nepotřebuje. Na stránce mám odkazy v pěkném tvaru a na ten když někdo klikne, tak se pomocí mod_rewrite přeloží na volání stránky s parametrem. Tato stránka, když pak má zobrazit obsah článku, se na začátku podívá do DB a třeba podle názvu (který mám v parametru) vyhledá daný článek a zobrazí.

    Pondělí, 04.02.2008 08:33 | odpovědět
  24. [24] Lolek

    Zdravím, zprvu bych vám chtěl poděkovat za krásný články, které jsou srozumitelné a velmi užitečné.

    Na svý stránce nemohu rozlušit jednu věc.

    Mám includované stránky následovně:

    [strong]

    ...header...

    $dir = "include/";

    $titlePage = "home.php";

    if($_GET["page"]) {

    if(file_exists($dir.$_GET["page"].".php")) {

    include($dir.$_GET["page"].".php");

    }

    else {

    include("include/404.inc.php");

    }

    }

    ...footer...

    [/strong]

    V souboru .htaccess má nastaveno následující:

    [strong]

    RewriteEngine on

    RewriteRule ^([^/]*)/?$ index.php?page=$1 [L,QSA]

    [/strong]

    Mám problém stím, že když chci zobrazit soubor rss.php (tak aby nebyl includován do stránky, ale byl samostatně zobrazen), který není v adresáři include/, ale v hlavním direktoráří, tak mi ho includuje zas do celé stránky a řekne že soubor neexistuje.

    Zkoušel jsem dát tuto podmínku:

    [strong]

    RewriteRule ^rss/?$ rss.php [L,QSA]

    [/strong]

    Ale nějak zvlášť to nepomohlo.

    Děkuji moc předem za radu!!!

    S pozdravem Lolek

    Pondělí, 12.05.2008 18:06 | odpovědět
  25. [25] Samuraj

    odpověď na [24]Lolek: Děkuju.

    Jde o to, jestli máte pravidlo pro RSS nad tím pro ostatní. Také by se dalo zkusit doplnit

    RewriteRule ^[^.|^/]*.php$ - [PT]

    aby nezpracovával php soubory pravidlem.

    Pondělí, 12.05.2008 18:36 | odpovědět
  26. [26] Lolek

    vy ste vazne zlaty, dekuji moc. S tim doplnkem mi to funguje!! Dekuji jeste jednou :-)

    Pondělí, 12.05.2008 18:52 | odpovědět
  27. [27] Lolek

    Měl bych ješte jednu otázečku. Když mám na své stránkce odkazy na jiné stránky tak to mám udělané přes tento odkaz:

    http://127.0.0.1/news&redir=http://www.samuraj-cz.com

    Nevím z jakého důvodu, ale když to dám takhle se http, tak mi to prostě hodí 403 Forbidden, pokud to dám bez toho tak mi ta stránka normalně naběhne a mohu to v klidu přesměrovat.

    NEvíte čím to je? :-(

    Pondělí, 12.05.2008 21:23 | odpovědět
  28. [28] houmrista

    Zdravím,

    lze nějakým způsobem podstrčit stránku na jiné doměně? Nějak se mi to nedaří a nevím, jak to vyřešit :(

    Úterý, 13.05.2008 13:40 | odpovědět
  29. [29] Samuraj

    odpověď na [28]houmrista: Myslím, že by to mělo normálně fungovat, když se jako přepis použije absolutní adresa na jiný web. Ale tuším, že třeba můj webhosting to má blokované.

    odpověď na [27]Lolek: Bohužel, nevím. Čekal bych, že to bude fungovat, ale možná se musí překódovat speciální znaky. Třeba pomocí rawurlencode.

    Úterý, 13.05.2008 17:07 | odpovědět
  30. [30] Lolek

    Ja asi tusim cim to bude, bude to tema lomitkama, ono je to asi bere jako tu hezkou url. Nevíte jakou mam dat podminku aby to nebralo? :(

    Úterý, 13.05.2008 22:05 | odpovědět
  31. [31] whysper

    Dobrý den začínám s mod_rewrite a chtěl bych se zaptat na jednu věc v .htaccess mám následující

    # presmerovani

    RewriteEngine on

    RewriteRule login.html /weby/wsc/index.php?page=login [L]

    RewriteRule signin.html /weby/wsc/index.php?page=signin [L]

    vše funguje skvěle v adresním řádku mám login.html a php s tím pracuje jako ?page=login. Chtěl bych se zeptat jak lze (jestli lze) udělat, abych nemusel vypisovat každé pravidlo zvlášť. Myslím tím jako že bude neco.html a to se nahradí na ?page=neco a pak budu mít necojineho.html a to se nahradí na ?page=necojineho.

    Díky moc za případnou odpověď

    Pondělí, 07.12.2009 20:58 | odpovědět
  32. [32] whysper

    A ještě bych se chtěl zeptat co je proměnná $1 resp. jakou má hodnotu Děkuji

    Pondělí, 07.12.2009 21:00 | odpovědět
  33. [33] Samuraj

    odpověď na [31]whysper: Možností je více, třeba:

    RewriteRule ^([^.]*).html$ /weby/wsc/index.php?page=$1 [L,QSA]

    $1 - první proměnná, to co je v prvních závorkách ()

    Pro zápis se používají regulární výrazy.

    Čtvrtek, 10.12.2009 11:44 | odpovědět
  34. [34] Petr

    Zdravím, řeším problém rewritu pro statický web. Snažím se zpřístupnit všechny stránky uložené jako *.html zpřístupnit jako */. Dále potřebuji trvale přesměrovat na domenu s www na začátku a automaticky doplňovat lomítka po zadání adresy. Použil jsem kód z příkladů z praxe a upravil si regulár, ale nefunguje to. Nenapsal by mi někdo jak to má vypadat?

    Sobota, 12.12.2009 13:27 | odpovědět
  35. [35] xzen

    Dobrý den, potřeboval bych radu:

    Mám web, který je úmístěný na doméně, např.:

    www.domena.cz/nazevwebu/index.php?page=nabidka-sluzeb

    a potřeboval bych k tomu dělat rewriting a stále mi to nejde, mohl by mi s tím někdo pomoci?

    (K zobrazování stránek používám index.php, do kterého je načítám pomocí

    <?php

    if (isset($_GET["page"]) && substr_count($_GET["page"], "/") < 1)

    $page = $_GET["page"];

    else

    $page = "$url[0]";

    $soubor = "pages/$page.php";

    if (file_exists($soubor))

    include $soubor;

    else

    include "pages/404-stranka-nenalezena.php";

    ?>

    Děkuji

    Pondělí, 20.12.2010 18:37 | odpovědět
  36. [36] Martina

    Dobrý den,potřebovala bych prosím poradit.

    Mám www.domena.cz/nabidka-sluzeb.php

    na teto stránce kliknu na odkaz hromosvody a zobrazi se mi www.domena.cz/hromosvody.php ,protoze tam je stranka přesmrovaná.potřebovala bych v .htaccess udělat aby se mi zobrazovala stranka s hromosvody jako: www.domena.cz/nabidka-sluzeb/hromosvody

    Odstraneni php koncovek uz vyresene mam.

    Pátek, 08.04.2011 21:40 | odpovědět
  37. [37] Internet shopping

    [url=http://myreviewsnow.net/reviews]Internet shopping[/url]

    This is a great post! Hope you can share more to us. Thanks!

    Pondělí, 16.01.2012 06:16 | odpovědět
  38. [38] NightHunter

    Zdravím hledám pomoc potřeboval bych z www.neco/seznam/anime.html udělat třeba www.neco/seznam/anime/

    Děkuji za odpověd popřípadě se mi ozvěte na email : erdomen95@seznam.cz

    Pondělí, 21.04.2014 00:44 | odpovědět
  39. [39] tom

    Zdravim, zacnu klasickou informaci, ze jsem prolezl vazne vsechny mozny weby a klicovy slova, abych nasel reseni, ale nic mi nefunguje, patrne to bude blbost nejaka. K veci. snazim se o krasny url.

    Vzor

    RewriteRule ^page/([^/\.]+)/?$ index.php?page=$1 [L]

    at uz v nem prepisuji a nazyvam cokoli jakkoli, mi nefunguje

    Nejde mi ani zprovoznit to co jste popisoval na zacatku tohoto tematu.

    Muj pripad je klasicky:

    http://www.example.com/clanek?clanek_id=1

    chtel bych

    http://www.example.com/1-nadpis-clanku

    RewriteRule ^stranka/?$ /index.php?page=stranka [L,QSA]

    normalne funguje, vyznam [L] atd chapu.

    Dekuji kazde dobre dusi, ktera by me navedla spravnym smerem.

    Tom

    Středa, 13.05.2015 06:00 | odpovědět
  40. [40] Samuraj

    Už se této oblasti dlouho nevěnuji, ale zkus

    RewriteRule ^([^/]*)/$ /index.php?page=$1 [L,QSA]

    Měl by přepsat

    http://www.example.com/1-nadpis-clanku/

    na

    http://www.example.com/index.php?page=1-nadpis-clanku

    Čtvrtek, 14.05.2015 10:59 | odpovědět
  41. [41] tom

    Dekuju za odpoved.

    U me mozna bude problem jinde, a omlouvam se to jsem minule nenapsal. Ten system neni napojeny na databazi, ale ridi se promennymi v jednotlivych souborech. Duvod proc to tak je nechapu, nicmene je to pozadavek. Tzn., ze vlastne formou ruznych if, echo, else, require, ob_start() je to cele provazane. Nerikam ze bych to nechtel udelat jinak, ja jsem system prevzal po predchudci (jeho syn), klient si to nenecha vymluvit, vidi vyhodu v tom, jak se systemem pracuje a nechce slyset o tom ze by se musel ucit jiny zpusob, i kdyz jednodussi, s tim nic neudelam.

    Jinymi slovy netusim, co bych mohl udelat aby to bralo ze souboru s id v nazvu (1.php) hodnotu promenne $nadpis. Jedine me napada, ze by system zustal vlastne bezdatabazovy, ale ochcal bych to zapisovanim do db pouze id a prislusneho nadpisu a odtud by se pak tahalo do url, jenze si neumim predstavit tu pakarnu aby se to do db zapsalo pokazdy kdyz tam zakaznik nasadi novej soubor. Jenom uvaha. Kazdopadne jestli vas nekoho napada jak hodnotu $nadpis vytahnout ze souboru s prislusnym id, budu vam vdecny. Moc dekuju, Tom

    Čtvrtek, 14.05.2015 14:20 | odpovědět
Přidat komentář

Vložit tag: strong em link

Vložit smajlík: :-) ;-) :-( :-O


Ochrana proti SPAMu, zdejte následující čtyři znaky image code

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách