Mod rewrite - fájlok kihagyása
Sziasztok!
Küzdök a mod rewrite-al. Elolvastam csomó tutorialt, megnéztem, hogy hogyan kéne működnie a dolognak, de mégsem működik úgy, ahogy írják.
Konkrétan egy front controllert szeretnék csinálni a kép fájlok kivételével. Úgy szeretném megoldani, hogyha a kért kép fájl nem létezik, akkor is a front controllert hívja meg az oldalt.
Egyelőre ott akadtam el, hogy a képfájlokat átirányítsam a hozzájuk tartozó mappába.
Így próbálkoztam:
Elvileg ha images/page.header.jpg-t írok be, akkor át kell alakítani az első rule-nak view/images/header.jpg-vé, és utána az L miatt abbahagyni az átírást.
Ehhez képest folytatja a rewriteot, és átadja az urlt a front controllernek. (A mod rewrite egy rakás szemét.)
El tudja magyarázni valaki, hogy miért nem megy a fenti rewrite, és hogyan tudom lecsekkolni, hogy létezik e a képfájl? RewriteCond %{REQUEST_URI} -f l próbálkoztam, de nem sok sikerrel.
■ Küzdök a mod rewrite-al. Elolvastam csomó tutorialt, megnéztem, hogy hogyan kéne működnie a dolognak, de mégsem működik úgy, ahogy írják.
Konkrétan egy front controllert szeretnék csinálni a kép fájlok kivételével. Úgy szeretném megoldani, hogyha a kért kép fájl nem létezik, akkor is a front controllert hívja meg az oldalt.
Egyelőre ott akadtam el, hogy a képfájlokat átirányítsam a hozzájuk tartozó mappába.
Így próbálkoztam:
RewriteRule images/page\.(\w+)\.jpg view/images/$1.jpg [NC,L]
RewriteRule (.*) index.php?url=$1 [QSA,NC,L]
RewriteRule (.*) index.php?url=$1 [QSA,NC,L]
Elvileg ha images/page.header.jpg-t írok be, akkor át kell alakítani az első rule-nak view/images/header.jpg-vé, és utána az L miatt abbahagyni az átírást.
Ehhez képest folytatja a rewriteot, és átadja az urlt a front controllernek. (A mod rewrite egy rakás szemét.)
El tudja magyarázni valaki, hogy miért nem megy a fenti rewrite, és hogyan tudom lecsekkolni, hogy létezik e a képfájl? RewriteCond %{REQUEST_URI} -f l próbálkoztam, de nem sok sikerrel.
Vicc
RewriteRule ^view/images/(\w+)\.jpg$ - [NC,L]
RewriteRule (.*) index.php?url=$1 [QSA,NC,L]
Az a benyomásom, hogy többször is lefut egymás után a htaccess, és ezért a last semmit sem ér benne. Nagyon gáz ez a mod rewrite, nem tudom, hogy ki találta ki ebben a formában, de igazi szemét munka.
RewriteCond
Egyébként a mod_rewrite működéséből és az Apache request kezeléséből adódóan fut le többször. Pl ha FastCGI-t használnál, látnál még egy subrequestet. Aki ebben a ludas, az nem a mod_rewrite, hanem az Apache maga. Ha megnézed a C forrást, akkor rájösz, hogy miért. :)
Aham
(C-hez sajnos nem értek :-))
A végleges verzió ez lett:
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^view/downloads/images/\w+\.jpg$ - [NC,L]
Egyébként fogalmam sincs, hogy ez miért működik így. A lényeg, amit akarok, hogy a fájl létezésénél töltse be a képfájlt, egyébként meg ha nem létezik a fájl, akkor a front controller hívódjon meg. A front controller meg majd betölti a 404es oldalt.
Nem tudom, hogy ezt conditionnel hogyan lehetne megcsinálni. Kellene bele or vagy and most így nem látom át, de nem tudok róla, hogy a cond-nál meg lehet e adni komplexebb feltételeket, és ha igen, akkor hogyan.
Nem logikus
Egyébként mint mondottam, érdemes a szabályok elé feltételt tenni, anélkül félkarú óriás.
Nem értem
Mondj egy példát plíz.
A feltételt pontosan hogy érted?
Én úgy, hogy a (.*)-os front controlleres átirányításhoz rakok egy conditiont, hogy a képfájlok kivételével a többit. De olyat hogyan lehet, hogy a !LÉTEZŐ! képfájlok kivételével a többit?
Példák
Ami a kérdésedet illeti, valahogy így oldanám meg. (Nem ellenőriztem, telefonról pötyögök. :)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]
Egyébként azt javaslom, hogy a statikus cuccokat tedd ki egy staric.domain.hu vhostra. A betöltési sebesség meg fogja köszönni.
Megnézem
Kezd egy picit világosabb lenni. Azt hiszem teljesen más koncepcióban gondolkodtak, akik megcsinálták ezt a "nyelvet".
Én úgy gondoltam, hogy a mod rewriteal egy réteget lehet képezni a host vagy directory fölé, vagy hát inkább úgy gondoltam, hogy alapból ott van egy réteg, ami átfordítja a bejövő urlt a hoston vagy directoryn belüli path-re, és ezt a réteget lehet módosítani.
Aztán ha egymás alatt több mappában van .htaccess fájl, akkor mindegyik egy külön rétegnek felel meg, és ha egy rétegen egyszer már átjutottunk, akkor ugyanahhoz a réteghez már nem térünk vissza. Ennél meg bonyolultabb a helyzet, mert találkozik az url a réteggel, a réteg újraírja, és az újraírt url ismét a rétegen kívülről kezdi az útját. Nincs semmilyen parancs, amivel ezt skippelni lehetne, és az adott rétegen belülről folytatni?
Amit te írtál annál az adam könyvtár rétegén kívülre került a bélához, és így tovább, ott abszolut érthető, mert nem maradt az adam rétegén belül az uri. Viszont szerintem lehetne olyan módosítót írni, amivel bent maradna. Kicsit olyan ez, mint a Chain, csak itt a htaccess fájlokra és nem a rule-okra.
Ha jól vettem észre, akkor a htaccess fájlok között nincs semmilyen kommunikáció, így gondolom nem is lehetséges, amire gondolok.
Köszi a kódot!
Megnézem működik e. Amire kíváncsi voltam, hogy az [OR]-t hogyan kell, mert nem találkoztam még vele. A másik, ami eddig nem volt egyértelmű, hogy több conditionnél melyikkel kezdődik a kiértékelés.
(Közben megnéztem, és működik, király! :-) )
A static-ra kirakás egyelőre még nem jön szóba, mert egyrészt nagyon kezdeti stádiumban van a dolog, másrészt egyelőre csak otthoni gépen csinálom, fogalmam sincsen, hogy a bérelt helyen miket lehet majd, és miket nem, meg hogy egyáltalán marad e az a hely...
Azt hiszem ha elkészül az oldal ezt lesz a legkevesebb átírni. Azért kösz a tanácsot.
Lol
RewriteRule ^images/design/(\w+)/?$ view/downloads/images/$1.jpg [NC,L]
RewriteRule ^stylesheets/(\w+)/?$ view/downloads/css/$1.css [NC,L]
RewriteRule ^javascripts/(\w+)/?$ view/downloads/js/$1.js [NC,L]
RewriteCond %{REQUEST_URI} !^/view/downloads/(images|css|js)/ [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?url=$1 [NC,QSA]
Ez most úgy működik, ahogy szeretném, csak az images/design/header megadással lehet lekérni a headert, és a view/downloads/images/header.jpg-vel nem.
Nagyon köszönöm!
Egy-két dolog nem tiszta
RewriteEngine on
RewriteRule ^images/design/(\w+)/?$ view/downloads/images/$1.jpg [NC,L]
RewriteRule ^stylesheets/(\w+)/?$ view/downloads/css/$1.css [NC,L]
RewriteRule ^javascripts/(\w+)/?$ view/downloads/js/$1.js [NC,L]
RewriteCond %{REQUEST_URI} !^/view/downloads/(images|css|js)/ [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?url=$1 [NC,QSA]
Ugye megcsináltam ez alapján a működő kódot, és nagyon jó, de van pár dolog, amit nem értek benne:
Ha direktben próbálom elérni a fájlokat, akkor miért az index.php-be küld? (mondjuk pontosan ezt akartam elérni)
Ugye akkor az uri ugyanúgy view/downloads/images/a.jpg, tehát az indexes első feltétel false, a második szintén false, és ezért nem szabadna, hogy átírás történjen. Ehhez képest viszont van átírás. Azt vettem észre, hogyha kiveszem a / jelet a view elől a conditionnél, akkor nem működik az egész kód. Ez miért van? Van köze ahhoz, hogy a direktben beírtakat az index.php kapja?
Ha az images/design/a átírásához használt rule-ból kiveszem a Last-ot, akkor szintén nem működik a kód. Ezt sem értem, hogy miért nem? Elvileg folytatnia kéne a futást ilyenkor, és az index.php-t ugyanúgy kihagynia. Ehhez képest nem az történik. Szóval nem értem, hogy ez most így miért működik, mert számomra nem logikus.
REQUEST_URI
^
miatt sosem teljesül, mivel a REQUEST_URI mindig/
-el kezdődik. Ha elhagyod a^
-ot is akkor már újra jó tud lenni, !csak! már másra is illeszkedik.És felette?
Sőt, ha a fenti rule-ban az images elé / jelet teszek, akkor nem működik. Na szal azt nem értem, hogy akkor most egy sima rewriterule az mit alakít át? Eddig úgy gondoltam, hogy az uri-t, de ezek szerint ez mégsem igaz.
Azért nehéz ezt az egészet megérteni, mert nem látok bele a folyamatba, hogy mi az input, mi az output, melyik fájl hányszor fut le, etc. Semmi lehetőségem nincs közben kiírni, hogy éppen hogy áll az átírási folyamat.
rewritelog?
Hogy ilyen is van
rewriteloglevel
Ahm
Nézd meg itt talán segít:
Kösz
Guide
Ok