Autor Zpráva
htaccess
Profil *
mám následující situaci. na localhostu mám umístěnou novou stránku, kterou si připravuji.. localhost/novastranka ... v této složce mám index.php a složku articles s článkama. Po nahrání na nějaký freehosting to asi bude vypadat takto.. novastranka.infinity.net ... dejme tomu. A nyní potřebuju udělat hezké url, takže když nakonfiguruji RewriteRule, aby uživatel viděl všechny články pod novastranka jako např. localhost/novastranka/clanek nebo novastranka.infinity.net/clanek , ale v realitě to bude odpovídat souboru localhost/novastranka/clanky/clanek nebo novastranka/clanky/clanek
Zkoušel jsem napsat pravidlo:
RewriteRule "^(?!index).+" "/pages/$0" [QSA]
ale to vrácí chybu /clanky/clanek was not found ...
Tak nemá tam být na začátku nějaká proměnná nebo nějaký další argument, který by vysvětlil, že řetězec před ^ má být to aktuální umístění adresář novastranka či doména stránky? Jak to dořešit?
Kajman
Profil
Edit: to pravidlo mně přijde divné. Máte složku articles s články, v pravidle máte pages a ještě navíc do adresy dáváte clanky.

Ale osobně bych si vyvíjel na adrese novastranka.localhost (upravíte hosts a konfiguraci apache) aby kořenové adresy byly pak stejné jak u hostingu.
htaccess
Profil *
hypotetická složka articles nebo clanky, to je jedno... Zkoušel jsem toto,ale stálese mi nedaří.

url
localhost/novastranka/clanek
RewriteRule "(.+)[^?/]" "/clanky/$0.php" [QSA,L]
Mě to píše The requested URL /clanky/clanek.php was not found on this server. Nevím jak je to možné... Ale přejmenoval to správně nebo ne, když to je umístěné v localhost/mojestranka/clanky/clanek.php ?

To co říkáte tu konfiguraci na změnu domény neumím udělat.


A to je testováno s nastavením
RewriteBase /novastranka
Kajman
Profil
Upravovaný .htaccess máte kde?

Tipnul, bych, že to pravidlo by se mělo zacyklit, ale to by server vracel chybový kód 500 nebo tak něco.

Můžete zkusit

RewriteBase /novastranka/
#jen pokud nebylo uz podstrceno
RewriteCond %{ENV:REDIRECT_STATUS} =""
#jen pokud se nezada primo o nejaky soubor (napr. obrazek)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule "(.+)[^/]" "clanky/$0.php" [QSA,L]

Ale spíše se vše, co není souborem, předá třeba souboru index.php a tam nějaký routovací proces podle cesty určí, která část programu se má spustit nebo zda je adresa nevalidní.
htaccess
Profil *
.htaccess je v localhost/novastranka

Pokus 1:
url: localhost/mojestranka/clanek
RewriteCond "clanek"
# RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "([^\.?/]+)" "/clanky/$1.php" [QSA,L]


Not Found
The requested URL /clanky/clanek.php was not found on this server.

RewriteCond "clanek" # jen pokus, ale asi mi tam chybí "and"
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "([^\.?/]+)" "/clanky/$1.php" [QSA,L]
The requested URL /novastranka/clanek was not found on this server.
(není tam /clanky/... )

Dále když přidám
# RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule "(.+)[^/]" "clanky/$0.php" [QSA,L]
Toto hlásí chybu Internal Server Error (Apache 2.4.4), protože má být s lomítkem na začátku:
RewriteRule "(.+)[^/]" "/clanky/$0.php" [QSA,L]

The requested URL /clanky/clanek.php was not found on this server.

Nakonec Zkouším:
RewriteCond "clanek"
RewriteCond %{REQUEST_FILENAME} -f
#RewriteRule "([^\.?/]+)" "/clanky/$1.php" [QSA,L]
RewriteRule "(.+)[^/]" "/clanky/$0.php" [QSA,L]
The requested URL /novastranka/clanek was not found on this server.

Zopakuji to cele s "RewriteBase /" a taky to nefunguje


Dík zapomoc. S tím -f jste mě navedl správným směrem.

Ale toto projde:

RewriteCond clanky/clanek.php -F

Bingo!

[pre]
# BEZ RewriteBase /
RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,L]

A jede!
Kajman
Profil
Před malým -f jsem zapomněl vykřičník. Doplnil jsem ho. U toho -F si opravte cestu na obecnější

RewriteCond clanky/$1.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,L]

Flag -F je náročnější na výkon, ale pokud to bude jen malý nevýznamný web, nebál bych se toho.
htaccess
Profil *
Tam byla chyba taky že $0 znamená celý nalezený řetězec a $1 je nalezený řetězec z části regexu v závorce (subpattern). Použití u posledního kodu ktery jste uvedl nedava smysl, protože na prvnim řádku nejsou závorky v regexu (subpattern). Cokoliv ted menim tak se mi nedari. Chtěl bych to zobecnit ale dostal jsem se jen k tomuto.

RewriteEngine On

RewriteCond "^(?!/index).+"
RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,E=page:$1]
RewriteCond clanky/%{page}.php -F
RewriteRule "(.+)[^/]" "/%{page}/$1.php" [QSA,L]

-f ani -f nefunguje. U toho předposledního řádku to -F jde změnit na -f, tam to asi nehraje roli. Nicméně podmínku
RewriteCond clanky/%{page}.php -F
odstranit nemohu, nefungovalo by to na další články.
htaccess
Profil *
Učím se to metodou pokus omyl.
htaccess
Profil *
Nevím jestli z posledních dvou příspěvků je jasné co teď potřebuju. Bylo by dobré zbavit se toho testu zda existuje soubor clanek.php. Clanek.php byl jen nazkoušku abych to rozchodil. Což je supr. Jenže jakýkoliv článek chci zpřístupnit pod adr. clanky není třeba pokaždé testovat clanek.php nebo jiné soubory... Ty soubory tam jsou... Ale nedaří se mi ten přebytečný test odstranit, aniž by to přestalo fungovat.


Ještě to šlo zredukovat...
RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,E=page:$1]
stále jede. Proč to jede respektive proč to potřebuje ten test souboru, nechápu.
Kajman
Profil
Podívejte se na obrázek
httpd.apache.org/docs/current/rewrite/tech.html#InternalRuleset

Nejdřív se testuje první parametr RewriteRule, teprve potom se testují RewriteCond uvedené na ním. Proto RewriteCond mají k dispozici parametry $0-$9 z reguláru RewriteRule. Naopak nemají k dispozici parametr nastavený flagem E - ten mají až další pravidla a jen v případě, že došlo k podstrčení. Není to moc intuitivní, proto je lepší si přečíst manuál a nedělat pokusy omyly, protože těch omylů bude hodně.

Když tam tu podmínku RewriteCond nedáte, tak se to nejspíše zacyklí (i s parametrem L je ukončí pravidla pro aktuální url, ale pokud se url změnila, celá pravidla se poté znovu pustí na novou interně podstrčenou url). U RewriteRule neomezujete, že před závorkou a za závorkou nesmí už nic být, takže se
postupně interně mění adresa
clanek => clanky/clanek.php
clanky/clanek.php => clanky/clanky/clanek.php
clanky/clanky/clanek.php => clanky/clanky/clanky/clanek.php
clanky/clanky/clanky/clanek.php => clanky/clanky/clanky/clanky/clanek.php
clanky/clanky/clanky/clanky/clanek.php => clanky/clanky/clanky/clanky/clanky/clanek.php
...
až to narazí na limit interních podstrčení a vyvolá to chybu. Když si zapnete logování, tak to uvidíte přesněji, tohle je jen odhad, co ten regulár použije do závorky.

Když byste v reguláru využil i začátek a konec testované adresy, tak by se to asi díky přidané tečce necyklilo. Tedy jakoukoliv adresu, ve které není tečka, to podstrčí do složky clanky a přidá koncovku .php i když ten .php soubor nemusí existovat.

RewriteEngine On
RewriteRule ^([^./]+)$ clanky/$1.php [L]
htaccess
Profil *
Kajman:
Díky moc za vysvětlení. Nemělo by to při zacyklení psát server error nebo internal server error nebo tak něco? Protože s tím se běžně při svých pokusech setkávám. Já tam ale vyloučil lomítko takže se to nezacyklovává [^\.?/] . Nepřišel jsem jak to logování zapnout. Zkoušel jsem tam psát ten custom log či jak to bylo, ale nejelo mi to jen to dávalo chybu. S tím dolarem na konci to jede. Dnes jsem už unavený znovu si to přečtu ráno.


Tak jo, takže ten caret trik je v tom, že tam musí být ten caret. A jak zapnout to logování abych to mohl ověřit? Díky
Kajman
Profil
httpd.apache.org/docs/current/mod/mod_rewrite.html#logging
htaccess
Profil *
Tak to nerozchodím. Apache 2.4.4 hlásí server error
Kajman
Profil
V logu apache by měl být vypsán i důvod server erroru.

Dáváte to do správné části konfigurace apache dle návodu?
httpd.apache.org/docs/current/mod/core.html#loglevel
htaccess
Profil *
Kajman:do .htaccess
Kajman
Profil
Tam to nejde nastavovat. Viz context v posledním odkaze.
htaccess
Profil *
Mám ještě dotaz. php soubory s článkama jsou pod /clanky ale hlavní soubor index.php je pod adresarem nova-stranka
tedy zadam např. localhost/nova-stranka/ nebo localhost/nova-stranka/index apod. a napíše to něco jako, že nova-stranka/clanky/index.php neexistuje.
Jak toto osetrit? Něco jsem zkoušel, bez úspěchu.

RewriteCond %{SCRIPT_FILENAME} ".+(?!/index)$" 
RewriteRule "^([^\.?/]+)$" "pages/$1.php" [L]



Asi jsem to zvládl

RewriteCond %{REQUEST_URI} "!index$" 
RewriteRule "^([^\.?/]+)$" "clanky/$1.php" [L]

RewriteRule "index$" "index.php" [L]
Kajman
Profil
A proč tam to index píšete? Když se odkážete jen na lomítko, tak by to mělo fungovat.

Obecně je vhodné psát obecnější pravidla později a konkrétnější nahoru. Pokud tedy trváte na adrese /index, kterou jsou snad v životě nikde neviděl, tak stačí přehodit pravidla.

RewriteEngine On

RewriteRule ^index$ index.php [L]

RewriteCond clanky/$1.php -F
RewriteRule ^([^./]+)$ clanky/$1.php [L]

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0