Autor Zpráva
fujrer
Profil *
Používám pro přesměrování domena.cz > www.domena.cz/ tento htaccess:

RewriteCond %{HTTP_HOST} ^domena.cz
RewriteRule ^(.*)$ http://www.domena.cz/$1 [R=301,QSA]

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.+[^/])$ $1/ [R=301,QSA,L]

Teď jsem u jednoho webu navíc přidal pro zbavení se nutnosti používat koncovky (.php) toto

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

Ale když kliknu na odkaz, vygeneruje se takováto url (stránka nenalezena):

http://www.domena.cz/mnt/data/accounts/m/mujucet/data/www/domena/page.php/


Jak to zařídit, aby obě funkce (zbavení se přípony a přesměrování na domena.cz/) dohromady fungovaly?
Kajman
Profil
Zkuste mezi řádek 5 a 6 dát ještě podmínku, že již nebylo tajně přepsáno
RewriteCond %{ENV:REDIRECT_STATUS} =""

A nové pravidlo by mělo být za těmi přesměrováními a je lepší tam dát flag [L] Ten flag přidejte i na řádku 2.
fujrer
Profil *
Děkuji. Bohužel je to pořád stejné.

Zkusil jsem:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

RewriteCond %{HTTP_HOST} ^domena.cz
RewriteRule ^(.*)$ http://www.domena.cz/$1 [R=301,QSA]

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^(.+[^/])$ $1/ [R=301,QSA,L]

a

RewriteEngine on

RewriteCond %{HTTP_HOST} ^domena.cz
RewriteRule ^(.*)$ http://www.domena.cz/$1 [R=301,QSA]

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^(.+[^/])$ $1/ [R=301,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

Ale nevím co je flag [L], htaccess je pro mě španělská vesnice...
Davex
Profil
Druhá varianta je správnější - všechna přesměrování by měla být před přepisem.

1) V přesměrování není dobré používat relativní cíl přesměrování. V druhém přesměrování použij absolutní nebo kořenovou adresu.

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

2) V pravidle pro odstranění přípony bude pravděpodobně vadit lomítko na konci adresy a mělo by se nechat požrat, aby se nepřepisovalo na /page/.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)/$ $1.php [L]
fujrer
Profil *
tohle "téměř" funguje, ale přidává to lomítko na konec www.domena.cz/page/ - zobrazí se stránka bez obrázků a bez stylů:
RewriteEngine on

RewriteCond %{HTTP_HOST} ^domena.cz
RewriteRule ^(.*)$ http://www.domena.cz/$1 [R=301,QSA]

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^(.+[^/])$ /$1/ [R=301,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)/$ $1.php [L]

RewriteCond %{ENV:REDIRECT_STATUS} ="" - přítomnost/nepřítomnost tohoto řádku nemá žádný vliv.


když použiju čistě jen tenhle vylepšený kód, tak to hází 404:
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)/$ $1.php [L]
Davex
Profil
fujrer:
tohle "téměř" funguje, ale přidává to lomítko na konec www.domena.cz/page/
Pokud se nemá přidávat, tak to zcela mění situaci a mělo to být známo hned na začátku.

zobrazí se stránka bez obrázků a bez stylů:
Pro připojení obrázků a stylů je třeba použít kořenové adresy.

když použiju čistě jen tenhle vylepšený kód, tak to hází 404:
To by se asi nemělo v regulárním výrazu vyžadovat lomítko na konci, když tam nemá být a není tam druhé přesměrování, které ho přidává.

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php [L]
fujrer
Profil *
Bohužel nefunguje. Kdo by za přiměřenou úplatu chtěl přímo na serveru vytvořit a odzkoušet htaccess s požadovanými vlastnostmi, napište prosím na extrapes@seznam.cz.
Davex
Profil
Pokud nepotřebuješ to lomítko, tak to zkus podle Řešení některých častějších problémů (FAQ) » Stránky s adresou bez koncovky.
fujrer
Profil *
toto hází 404:

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.php$ http://%{HTTP_HOST}/$1 [L,R=301,NE]
Davex
Profil
fujrer:
To je jen přesměrování na variantu bez přípony. Potřebuješ to, co jsi přeskočil.

# podstrčení PHP, přepsat pouze na existující skript
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    $1.php    [L]
fujrer
Profil *
tak tohle samo o sobě pro "bezpřínovování" funguje:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    $1.php    [L]

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.php$ http://%{HTTP_HOST}/$1 [L,R=301,NE]

ale když to přidám k tomu svému zbytku, tak se nakonec URL začne přidávat lomítko a skončí to 404kou:

RewriteEngine on

RewriteBase /

RewriteCond %{HTTP_HOST} ^domena.cz
RewriteRule ^(.*)$ http://www.domena.cz/$1 [R=301,QSA]

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.+[^/])$ $1/ [R=301,QSA,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    $1.php    [L]

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.php$ http://%{HTTP_HOST}/$1 [L,R=301,NE]
Davex
Profil
A co by to mělo přesně dělat?

1. pravidlo přesměrovává na doménu s www
2. pravidlo přesměrovává na variantu s lomítkem
3. pravidlo podstrkává adrese bez přípony skript s příponou .php
4. pravidlo přesměrovává adresu s příponou .php na variantu bez přípony

Pokud se nemá přidávat lomítko za adresu, tak tam nemůže být 2. pravidlo, protože zároveň nemohou být splněny dva protichůdné požadavky (přidávat a nepřidávat lomítko).
fujrer
Profil *
Potřebuji, aby to dávalo lomítko za .cz, aby všechny možné varianty (domena.cz, domena.cz/, www.domena.cz) končily jedním totožným url www.domena.cz/
Davex
Profil
fujrer:
Za doménou je lomítko vždy samo od sebe a není potřeba ho přidávat. (A to 2. pravidlo ho tam ani nepřidává. Pravidlem mám na mysli celé RewriteRule se všemi příslušejícími podmínkami RewriteCond)
fujrer
Profil *
Děkuji, asi to nevyřešíme, nechám to někomu udělat.
Davex
Profil
fujrer:
Děkuji, asi to nevyřešíme
Myslím, že řešení je snadné. Stačí jen vynechat druhé pravidlo (případně přidat původní podmínku pro adresář a přidat příznaky [L,NE] u prvního přesměrování) a mělo by to fungovat. Nebo je ještě v něčem problém?

RewriteEngine on
 
RewriteBase /
 
RewriteCond %{HTTP_HOST} ^domena.cz
RewriteRule ^(.*)$ http://www.domena.cz/$1 [L,NE,R=301,QSA]
 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$    $1.php    [L]
 
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.php$ http://%{HTTP_HOST}/$1 [L,R=301,NE]
fujrer
Profil *
No jo, funguje to.

Já věděl, že tě donutím mi to napsat!

Ne, opravdu děkuji veleuctivě, že jsi strávil půl neděle řešením mého problému. Já už bych se dávno poslal...

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:

0