Autor Zpráva
Milan1236000
Profil
Zdravím,
mám jen malý technický dotaz. Je jedno v jakém kódování je soubor .htaccess?

Ještě když už jsem u toho, tak se chci zeptat, proč mi nefunguje RewriteRule.
V .htaccess mám zatím tohle:
# Chybové stránky
ErrorDocument 404 "http://localhost/projekt/chyba404.php"
ErrorDocument 403 "http://localhost/projekt/chyba403.php"
#--- potud to funguje

# tohle tam je jen na zkoušku a taky funguje ↓
RewriteEngine On
RewriteRule (.*) http://www.jakpsatweb.cz [R]
# po zakomentování dvou předchozích řádků a odkomentování zbytku ("nezobrazování přípony .php") až do konce, se přípona pořád v URL zobrazuje

#RewriteEngine On
#RewriteBase /
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule ^(.*)/$ $1.php [L]
Čím to může být, že to nefunguje?
Davex
Profil
Milan1236000:
Je jedno v jakém kódování je soubor .htaccess?
Pokud to bude něco založené na ASCII, tak je to skoro jedno (nefungoval by třeba soubor v UTF-8 uložený s BOM, kde vadí ten BOM).

se přípona pořád v URL zobrazuje
Protože to pravidlo příponu z URL neodstraňuje, ale přepisuje URL s lomítkem na konci na soubor.php.
Milan1236000
Profil
Davex:
Aha, takže potom by tedy konec mohl být takhle:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$\.php /$1 [L]
, což taky nefunguje. Jak by to mělo být správně, aby se ta přípona schovala?
Díky.
Keeehi
Profil
První je z čeho (tam přece PHP mít nechceš) a druhý parametr je na co se to má převést (a tam tu koncovku chceš neboť to je reálný soubor)
RewriteRule ^(.*)/$ /$1.php [L]
juriad
Profil
Milan1236000:
RewriteRule ^(.*)\.php$ /$1 [R=301, L]
Ten dolar značí konec adresy. Musí tedy být až za příponou.
Říká to "začátek, zapamatovat cokoli, tečka php, konec" připiš na tu zapamatovanou část.

Keeehi:
Zdá se mi, že chce něco jiného.

Milan1236000:
Jak má vypadat odkaz na tvou stránku? (/prase.html)
Co se má zobrazit v URL? (/prase)
Jaký skript se má zavolat? (/prase.php)

Tyto tři otázky určí, jaké pravidlo vlastně potřebuješ. V závorkách je jen uvedený nějaký nesouvisející příklad.
Milan1236000
Profil
Keeehi, juriad:
U
RewriteRule ^(.*)\.php$ /$1 [R=301, L]
jsem musel smazat mezeru, aby se stránka zobrazila, ale i tak ani jeden nefunguje.
Zkoušel jsem různé kombinace, které jsem našel na internetu, ale ani jedna mi nefunguje, i když k tomu přidám Options +FollowSymlinks.
Nechápu, co kde je špatně. Už asi 2 dny to různě zkouším, ale furt nic.

juriad:
Je to tak, jak píšeš. Mám soubor /index.php, ale v URL chci zobrazit jen /index
Davex
Profil
Milan1236000:
Proč to neuděláš takto?
Milan1236000
Profil
Davex:
Ano, i to jsem už zkoušel. Nic nefunguje, nevím, jak je to možné. Té přípony se prostě nemůžu zbavit.
Keeehi
Profil
A zkoušíš ji tam nepsat, že? => když napíšeš adresu na konci bez .php, tak se nic nezobrazí. Pokud ano, pak máš opravdu někde chybu.
Pokud se to zobrazí správně a jen v případě, že zadáš adresu s .php na konci se neprovede přesměrování, pak ke vše v pořádku, protože o tom ten kód vůbec není.
Milan1236000
Profil
Keeehi:
Zkoušel jsem s příponou i bez ní, ale stránka se zobrazí pouze s ní. Ještě to zkusím na jiný server, jestli to schválně půjde tam, když u mě to na WampServeru nejde.
--
Tak jsem zkoušel EasyPHP a XAMPP a taky to tam nefunguje. To snad není možné, že to nejde...
Davex
Profil
Nemáš ten .htaccess a skripty v nějakém podadresáři?

Kdybys třeba všechno měl v podadresáři /projekt/, tak musíš ten adresář uvést buď v RewriteBase nebo přímo v přepisovacím pravidle.

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    /projekt/$1.php    [L]
Milan1236000
Profil
Davex:
Mám tam podadresář. Je to takováhle struktura:
PC:
C:\wamp\www\projekt
Ve složce projekt jsou všechny soubory, i .htaccess.

URL:
http://localhost/projekt/index.php

Nyní tam tedy mám:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$ /projekt/$1.php [L]
už to tedy jde, stránka se zobrazí, i když příponu smažu. Díky moc.
Teď už bych jen potřeboval, aby se přesměrovávalo, když tam tu příponu napíšu, na stránku bez přípony. Někde jsem viděl, že by mohlo stačit smazat přípony .php u všech souborů, ale to se mi nechce.
juriad
Profil
Milan1236000:
Viz část # přesměrování na verzi bez přípony na Diskuse JPW: Řešení některých častějších problémů (FAQ) » Stránky s adresou bez přípony
Milan1236000
Profil
juriad:
Díky moc. Už vše funguje, jak má. Musel jsem ale ještě přejmenovat adresář, protože se to z nějakého důvodu zobrazovalo špatně u některých položek. Po přejmenování už jde úplně vše.
--
Ještě taková drobnost. Mám v adresáři projekt složku se stejným názvem jako jeden soubor php ve složce projekt.
I když do .htaccess zkopíruji odsud: Diskuse JPW: Řešení některých častějších problémů (FAQ) » Stránky s adresou bez přípony
<IfModule mod_negotiation.c>
  # vypnout automatické vyhledávání alternativ
  Options -MultiViews
</IfModule>
Tak se při zobrazení souboru (který má stejný název jako adresář) zobrazí struktura adresáře se stejným názvem jako soubor.
Jak se to dá opravit?
Kubo2
Profil
Milan1236000:
Musel jsem ale ještě přejmenovat adresář, protože se to z nějakého důvodu zobrazovalo špatně u některých položek. Po přejmenování už jde úplně vše.
Pravdepodobne client-side browser cache.

Tak se při zobrazení souboru (který má stejný název jako adresář) zobrazí struktura adresáře se stejným názvem jako soubor.
Jak se to dá opravit?
Nepomenovávať adresáre a súbory na rovnakej úrovni rovnako.
Milan1236000
Profil
Kubo2:
To právě potřebuji. Mám soubor interpreti.php a složku interpreti. V URL se správně zobrazuje např. .../interpreti/avicii , ale už ne jen samotné interpreti.php
Nechci to pojmenovávat jinak, ale přinejhorším to budu muset udělat.
Milan1236000
Profil
Jak u tohohle
ErrorDocument 404 "http://localhost/projekt/chyba404.php"
příkazu nastavím, aby se objevila chybová stránka, ale v URL zůstala špatně zadaná cesta?
Díky.
juriad
Profil
Milan1236000:
Nezadáš tam URL, ale jen cestu, tedy /projekt/chyba404.php

httpd.apache.org/docs/2.2/mod/core.html#errordocument, chceš to „internally redirect to a local URL-path to handle the problem/error“

„Note that when you specify an ErrorDocument that points to a remote URL (ie. anything with a method such as http in front of it), Apache will send a redirect to the client to tell it where to find the document, even if the document ends up being on the same server.“
Milan1236000
Profil
juriad:
Ano, to je ono.
Díky moc.

Možná už jen drobnost. Když napíšu do URL cestu, která neexistuje, chybová stránka se zobrazí a v URL zůstane chybně napsaná cesta.
Když ale do URL za cokoli napíšu lomeno, zobrazí se stránka bez stylů s výpisem chybové stránky a když kliknu třeba na položku v menu, zůstane tam chybová stránka, ale v URL se za to připsané lomeno připisují cesty a nezobrazí se to správně.
Keeehi
Profil
Odkazuj od kořene webu a bude to dobré. <a href="/tvuj-odkaz.htm">

To samé i se styly, scripty atp.
Milan1236000
Profil
Keeehi:
Super, díky.
Snad už jen poslední věc. V kořenovým adresáři mám pár složek. Když se do URL napíše cesta do složky, otevře se struktura složky a v ní jednotlivé soubory. Jak se to dá zamezit?
juriad
Profil
Options -Indexes
Milan1236000
Profil
Skvěle, díky všem. :)
Milan1236000
Profil
Zdravím,
po delší době jsem se k tomu opět vrátil a potřeboval bych radu.
Mám soubor interpreti.php a podle podmínky se zobrazuje buď seznam interpretů (http://localhost/hhh/interpreti) nebo samotný interpret (http://localhost/hhh/interpreti?interpret=adele).
Do souboru .htaccess jsem přidal: RewriteRule ^interpreti.php/(.*)$ interpreti.php?interpret=$1, takže se stránka správně zobrazí, když do URL zadám: http://localhost/hhh/interpreti.php/adele, ovšem z nějakého důvodu se nezobrazují obrázky - to je ale nyní vedlejší.

Chtěl bych docílit toho, aby šlo na interprety přistupovat z adresy http://localhost/hhh/interpreti/adele, ale vyzkoušel jsem hodně kombinací typu
RewriteRule ^interpreti\.php/(.*)$ interpreti.php?interpret=$1
RewriteRule ^interpreti[.php]/(.*)$ interpreti.php?interpret=$1
RewriteRule ^interpreti/(.*)$ interpreti.php?interpret=$1
Ale ani jedna možnost nefunguje. Jak to?
juriad
Profil
Milan1236000:
Obrázky ti nefungují, protože stránka není najednou v adresáři (z pohledu prohlížeče) http://localhost/hhh/, ale v adresáři http://localhost/hhh/interpreti.php/.

Ta poslední možnost by měla fungovat:
RewriteRule ^interpreti/(.*)$
Milan1236000
Profil
juriad:
Nefunguje, hází to Nenalezeno (i po restartu serveru).
Milan1236000
Profil
Smazal jsem RewriteBase / a zjistil, že když je tam RewriteRule ^interpreti/(.*)$ interpreti.php?interpret=$1, tak se za parametr interpret přidává přípona .php, tu potřebuji smazat, ale jak?
Když označené lomeno zaměním za pomlčku, tak vše funguje, ale já bych tam chtěl to lomeno.
Kajman
Profil
Konkrétnější pravidla dávejte před obecná a přidejte flag L.
Milan1236000
Profil
Kajman:
Dal jsem tohle konkrétnější před to obecné a už to jde. Sice se kvůli tomu nezobrazovaly obrázky, ale to jsem vyřešil přidáním ../ před cestu k obrázku. Jiná možnost mě nenapadla.

Bezva, opět moc díky.)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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