Autor Zpráva
Joan
Profil
Zdravím vás,
fungují mi stránky vkládané pomocí prvního parametru (z kořenové složky pro subdoménu) a podstránky vkládané pomocí druhého parametru (ze samostatné složky uvnitř kořenové složky). Dokud jsem měla v adrese parametry typu
/?str=barva&vyber=zelena

a soubor se stylem v kořenové složce, obrázky (fotky) ve složce "obrazky", obrázky na pozadí ve složce "extra" - obojí samozřejmě uvnitř kořenové složky - tak se zobrazovalo všechno přesně tak, jak má.

Nyní jsem pomocí .htaccess dosáhla adres, kdy hodnota parametru je povýšena na složku, takže mám např.:
/barva/zelena/

soubor se stylem stále v kořenovém adresáři, obrázky ve vkládaném souboru stejně jako v případě parametrické adresy
<img src="./obrazky/1th.jpg">

a ve stylopisu
background: #fff url(./extra/pozadi.jpg)

a od této chvíle již nezobrazím ani fotku ze složky "obrazky", ani obrázek na pozadí ze složky "extra". Nepomůže ani bez tečky před lomítkem, ani obsah závorky v uvozovkách či apostrofech.
Cesta k obrázkům dle výše uvedené cesty IMG SRC je stejná, jako když tam napíši
<img src="http://www.subdomena.domena.tld/obrazky/1th.jpg">


Jsem poněkud v koncích, protože nevím, zda mám pouze chybu v cestě k obrázkům (ale kde?) anebo je snad nutné samostatné adresáře pro obrázky ještě vnutit do .htaccess? Děkuji za laskavou nápovědu!
Davex
Profil
Nepřepisují se cesty /extra/ a /obrazky/ na ten skript, který vkládá stránky do sebe? Co se zobrazí, když zadáš do prohlížeče URL http://www.subdomena.domena.tld/obrazky/1th.jpg?

V kódu stránky a stylopisu by měla být cesta k obrázkům s lomítkem na začátku /obrazky/1th.jpg.
Joan
Profil
Davex:
Děkuji za odpověď. Když zadám ručně tuto URL, zobrazí se mi moje vlastní chybová stránka, ovšem bez vloženého obrázku. Stejně tak např. patička nemá obrázek.
Všechny cesty ve fotogalerii již od počátku mám pouze s lomítkem bez tečky, jinde jsem tu tečku ale přidala. Tečka před lomítkem znamená "tento adresář", že? Ale bez tečky snad taky, nebo ne? Takže já rozdíl nevidím, ani ve funkčnosti stránek...

P.S.: Co prosím znamená slovní spojení přepisovat (se) na skript? Četla jsem to tu vícekrát, ale nerozumím tomu. Díky za vysvětlení!
Davex
Profil
Joan:
Co prosím znamená slovní spojení přepisovat (se) na skript?
Někde se také píše, že se adrese podstrčí skript. Znamená to, že se jedna adresa přepíše na nějakou jinou (na jméno skriptu).

Dejme tomu, že tam máš pravidlo, které přepíše původní adresu na skript nebo-li se všem adresám podstrčí skript a původní adresa se předá, rozdělená v lomítku, jako parametry skriptu:

RewriteRule ^(.+)/(.+)$ /index.php?str=$1&barva=$2 [L]

Toto pravidlo přepíše všechny cesty, ve kterých se vyskytuje alespoň jedno lomítko, na jméno skriptu, který se spustí. To znamená, že pokud je v cestě k obrázkům lomítko obrazky/1th.jpg, tak to vyhovuje regulárním výrazu v přepisovacím pravidle a místo odeslání obrázku se spustí skript /index.php?str=obrazky&barva=1th.jpg.

Zamezí se tomu podmínkou, aby se přepisovaly pouze cesty, které nevedou k žádnému souboru:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/(.+)$ /index.php?str=$1&barva=$2 [L]
Joan
Profil
Díky Davexi za vysvětlení! Zkusila jsem přidat podmínku ne-existence souboru, ale vliv to nemělo žádný. Poté jsem do svého .htaccessu místo svých hodnot vložila
RewriteRule ^(.+)/(.+)$ /index.php?str=$1&vyber=$2 [L]
(akorát jsem napsala svoje jméno parametru vyber) a ukázala se mi 404-ka, ale apachovská, ne moje.
Pak jsem svůj bez obrázku funkční .htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ ?str=$1 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)?/?$ /?str=$1&vyber=$2 [L,QSA]

ke kterému jsem dospěla více pokusy, postupně zakomentovávala ze zvědavosti, co udělá zakomentování napřed 5. a potom 4. řádku - a ejhle! Vždy se načetla stránka komplet i s obrázky, podle úrovně parametru. Protože jsem de facto ale neudělala vůbec žádnou změnu (přidání ... !-f opravdu nepomohlo), byla mi náhlá funkčnost stránek (zatím na localhostu s nastavením subdomény v souboru hosts) podezřelá. Vymazala jsem tedy cache Firefoxu, zavřela prohlížeč, znovu otevřela - a byla jsem tam, kde předtím. Tj. obrázky ze složky "obrázky" ani ze složky "extra" ne a ne se natáhnout :-(.
Jediné plus je to, že jsem si ověřila, že v názvu souboru má být opravdu jen to lomítko na začátku, tečka už ne.

Řídila jsem se hlavně tímto návodem při tvoření pěkných adres. Zkoušela jsem podle jeho návodu přidat řádky na vytvoření subdoményi
RewriteCond %{HTTP_HOST} ^psikusy.zlatberry.cz
RewriteCond %{REQUEST_URI} !psikusy/
RewriteRule ^(.*)$ psikusy/$1


kde ale vyznačená stříška musí být, jinak jsem dostala chybu 500. K čemu vlastně je to vytváření subdomény pomocí .htaccess?
Škoda, že není nějaký ucelenější návod na používání .htaccess, tj. co kdy kde a jak se používá. A taky proč. Originální dokumentace je natolik odborná, že je (pro mě) nepoužitelná, přestože angličtina mi vůbec nevadí. A ty svoje stránky bych už hodně potřebovala rozběhnout i s těmi obrázky...
Kde dělám chybu?
Davex
Profil
Joan:
přidání ... !-f opravdu nepomohlo
Podmínka se vztahuje pouze k jednomu následujícímu pravidlu, takže druhé pravidlo podmínku nemá a vykoná se vždy. Přidej podmínku také druhému pravidlu:

RewriteEngine On 
RewriteBase / 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/$ ?str=$1 [L,QSA] 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ /?str=$1&vyber=$2 [L,QSA]

K čemu vlastně je to vytváření subdomény pomocí .htaccess?
Je to dobré v případě, kdy hosting neumožňuje nastavit subdoménu v administraci nebo se nevytvářejí automaticky.

Škoda, že není nějaký ucelenější návod na používání .htaccess, tj. co kdy kde a jak se používá.
Stručně se tématu věnuje i Yuhů: http://www.jakpsatweb.cz/server/mod-rewrite.html.
Joan
Profil
Davex:
Podmínka se vztahuje pouze k jednomu následujícímu pravidlu, takže druhé pravidlo podmínku nemá a vykoná se vždy.

Wow! Už mi to jede, jak má, tisíceré díky Tobě!
Vidím, že jsem špatně pochopila tento Tvůj příspěvek, kde píšeš, že "Je zbytečné dvakrát zjišťovat existenci souboru nebo adresáře."

Proč ale podmínka existence souboru není nutná v případě zobrazování parametrů v adresách? A je nutná pouze u pěkných adres?

Můžeš mi prosím ještě polopaticky vysvětlit větu "Zamezí se tomu podmínkou, aby se přepisovaly pouze cesty, které nevedou k žádnému souboru"? Vždyť přece všechny cesty vedou a mají vést k nějakému souboru - buď PHP anebo třeba JPG, ne? Jinými slovy nevím, ve kterých případech podmínku s !-f anebo !-d použít...

Po zadání adresy ručně
http://www.subdomena.domena.tld/obrazky/1th.jpg

se mi už náhled obrázku skutečně ukáže!

Ano, díky, k Juhůově stránce se často vracím. Ale právě že je stručný, tak už postrádám někde nějaké vysvětlení jako například:

1) kdy použít {HTTP_HOST} a kdy zase {REQUEST_URI} anebo {QUERY_STRING}
2) proč se někdy objevuje v RewriteCond znak % a jak se jeho použití liší od $
3) kde se vzal parametr rw=1 a proč zrovna tohoto znění u změn dynamických adres na statické tady
4) proč lze někdy vynechat RewriteRule a psát rovnou RewriteCond (už si nevzpomenu, kde jsem to na diskusi viděla)

Takovéto detaily mi právě chybí, protože se vyskytují a já se nechytám :-(
Davex
Profil
Joan:
Vidím, že jsem špatně pochopila tento Tvůj příspěvek, kde píšeš, že "Je zbytečné dvakrát zjišťovat existenci souboru nebo adresáře."
V podstatě sis ho vyložila správně, protože tam jsem Michalovi úpravou regulárního výrazu sloučil dvě pravidla do jednoho ;-)

V tvém případě, jak na to tak koukám, je vlastně první pravidlo zbytečné, protože druhému regulárnímu výrazu vyhoví i cesta s jedním lomítkem na konci. Jen bys to musela ošetřit v PHP skriptu a netestovat přítomnost proměnné isset($_GET['vyber']), ale kontrolovat neprázdný obsah !empty($_GET['vyber']).

Proč ale podmínka existence souboru není nutná v případě zobrazování parametrů v adresách? A je nutná pouze u pěkných adres?
Existující soubory přepisovat na skript nechceš a u pěkných adres chceš předat část cesty, která vlastně vůbec neexistuje, jako parametry skriptu. Takže v prvním případě ta podmínka není nutná, když se nic nepřepisuje a parametry se předají skriptu přímo.

Vždyť přece všechny cesty vedou a mají vést k nějakému souboru
Pokud budu mít pěknou adresu http://www.example.com/pisnicka/mame-radi-zvirata-protoze-jsou-chlupata, tak nemusí vést k žádnému souboru. Je to prostě jen URL a na serveru takový soubor být nemusí, protože se pomocí mod_rewrite jen změní (přepíše) cesta na skript s parametry: /skript.php?co=pisnicka&nazev=mame-radi-zvirata-protoze-jsou-chlupata.

Jinými slovy nevím, ve kterých případech podmínku s !-f anebo !-d použít..
Většinou tehdy, pokud potřebuješ na URL zobrazit něco užitečného, ale obsah vytváří podle cesty z URL nějaký skript.

1) kdy použít {HTTP_HOST} a kdy zase {REQUEST_URI} anebo {QUERY_STRING}
Pokud potřebuješ přepisovat podle jména serveru (např. přesměrovat z example.com na www.example.com), cesty z URL (např. nepřepisovat vše co začíná na /icons/) nebo podle parametrů (např. přesměrovat z URL s parametry na pěkné adresy).

2) proč se někdy objevuje v RewriteCond znak % a jak se jeho použití liší od $
Slouží k identifikaci zpětných referencí z regulárních výrazů - viz Zapamatuj a vzpomeň si. Používají se % a $, aby se daly odlišit hodnoty získané v RewriteCond nebo RewriteRule, když jsou potřeba z obou zároveň.

3) kde se vzal parametr rw=1 a proč zrovna tohoto znění u změn dynamických adres na statické tady
To je tam kvůli tomu, protože po jednom přepisu se přepisování spouští znova pro přepsanou adresu, a když se přidá parametr rw=1, tak už to s ním nevyhoví podmínce v přepisovacím pravidlu a nepřepisuje se to znova.

4) proč lze někdy vynechat RewriteRule a psát rovnou RewriteCond (už si nevzpomenu, kde jsem to na diskusi viděla)
Samostatné RewriteCond se sloučí s následujícím jako „a zároveň“.


Moderátor Davex: Z tohoto místa byly vytrženy příspěvky do tématu Špatné odeslání formuláře, když je web na pěkných adresách.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0