Autor | Zpráva | ||
---|---|---|---|
htaccess Profil * |
#1 · Zasláno: 2. 12. 2022, 16:41:20
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] RewriteRule "^(?!index).+" "/pages/$0" [QSA] 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] RewriteRule "(.+)[^?/]" "/clanky/$0.php" [QSA,L] 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 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 1RewriteBase /novastranka/ 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 "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 "clanek" # jen pokus, ale asi mi tam chybí "and"
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule "([^\.?/]+)" "/clanky/$1.php" [QSA,L] (není tam /clanky/... ) Dále když přidám # RewriteCond %{ENV:REDIRECT_STATUS} ="" # RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule "(.+)[^/]" "clanky/$0.php" [QSA,L] RewriteRule "(.+)[^/]" "/clanky/$0.php" [QSA,L] RewriteRule "(.+)[^/]" "/clanky/$0.php" [QSA,L] The requested URL /clanky/clanek.php was not found on this server. Nakonec Zkouším: 1RewriteCond "clanek" RewriteCond "clanek"
RewriteCond %{REQUEST_FILENAME} -f
#RewriteRule "([^\.?/]+)" "/clanky/$1.php" [QSA,L]
RewriteRule "(.+)[^/]" "/clanky/$0.php" [QSA,L] Zopakuji to cele s "RewriteBase /" a taky to nefunguje Dík zapomoc. S tím -f jste mě navedl správným směrem. 1Ale toto projde: 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 |
#6 · Zasláno: 3. 12. 2022, 12:51:05
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 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 * |
#7 · Zasláno: 3. 12. 2022, 14:57:22
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.
1RewriteEngine On 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 * |
#8 · Zasláno: 3. 12. 2022, 15:58:44
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 RewriteCond clanky/clanek.php -F
RewriteRule "([^\.?/]+)" "clanky/$1.php" [QSA,E=page:$1] |
||
Kajman Profil |
#10 · Zasláno: 3. 12. 2022, 23:55:21
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 1clanek => clanky/clanek.php clanek => clanky/clanek.php 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 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 |
#12 · Zasláno: 4. 12. 2022, 01:12:25
|
||
htaccess Profil * |
#13 · Zasláno: 4. 12. 2022, 09:21:39
Tak to nerozchodím. Apache 2.4.4 hlásí server error
|
||
Kajman Profil |
#14 · Zasláno: 4. 12. 2022, 19:03:41
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 * |
#15 · Zasláno: 5. 12. 2022, 13:45:35
Kajman:do .htaccess
|
||
Kajman Profil |
Tam to nejde nastavovat. Viz context v posledním odkaze.
|
||
Časová prodleva: 3 dny
|
|||
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)$" RewriteCond %{SCRIPT_FILENAME} ".+(?!/index)$"
RewriteRule "^([^\.?/]+)$" "pages/$1.php" [L] Asi jsem to zvládl 1RewriteCond %{REQUEST_URI} "!index$" RewriteCond %{REQUEST_URI} "!index$"
RewriteRule "^([^\.?/]+)$" "clanky/$1.php" [L]
RewriteRule "index$" "index.php" [L] |
||
Kajman Profil |
#18 · Zasláno: 8. 12. 2022, 20:21:15
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. 1RewriteEngine On RewriteEngine On
RewriteRule ^index$ index.php [L]
RewriteCond clanky/$1.php -F
RewriteRule ^([^./]+)$ clanky/$1.php [L] |
||
Časová prodleva: 2 roky
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0