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ř.: https://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).
V 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 header z PHP 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 https://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 ^(.*)$ https://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
- URI
- Uniform Resource Identifier (URI): Generic Syntax - Standard RFC3986
- Universal Resource Identifiers in WWW – popis URI od W3C
- Cool URI
- Cool URIs don’t change – v tomto článku W3C doporučuje pěkné adresy
- Dobré adresy jsou dobré
- SEO – struktura a přesměrování
- Mod_rewrite
- Apache modul mod_rewrite - originální popis modulu
- Mod_rewrite - návod - dobrý popis mod_rewrite od autora Yuhů
- Mod_rewrite pro hezká URL – RewriteEngine a RewriteRule
- Mod_rewrite - příklady
- Jiné metody přesměrování
- Nečekaný potenciál chybové 404 stránky – jak přesměrovávat pomocí chybové stránky 404
- Regulární výrazy
- Regulární výrazy – velmi dobrý web věnovaný regulárním výrazům
- Regulární výrazy v PHP 1.
- Regulární výrazy v PHP 2.
- Regulární výrazy v příkladech
- Regulární výrazy v praxi - subvýrazy
- Vyhledávání v textu pomocí regulárních výrazů
Díky za článek, až tady jsem konečně našel to co jsem potřeboval!
Petr
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
odpověď na [2]mtommy: No jestli jsem to dobře pochopil, tak je to jednoduché.
RewriteRule ^$ /neco.php [L,QSA]
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ěď.
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
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.
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]
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!
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/.
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.
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.
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
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.
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.
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".
odpověď na [7]Samuraj:
Nevedel by nahodou nekdo proc pridani lomitka nezafunguje napr. u:
http://domena.cz/kategorie-pl175
Dekuji
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
odpověď na [17]Samuraj: Opravdu chyba u me - diky
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)
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 :-(
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é).
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
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í.
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
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.
vy ste vazne zlaty, dekuji moc. S tim doplnkem mi to funguje!! Dekuji jeste jednou :-)
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? :-(
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 :(
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.
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? :(
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ěď
A ještě bych se chtěl zeptat co je proměnná $1 resp. jakou má hodnotu Děkuji
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.
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?
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
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.
[url=http://myreviewsnow.net/reviews]Internet shopping[/url]
This is a great post! Hope you can share more to us. Thanks!
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
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
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
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