ugrás a tartalomhoz

Mod rewrite - fájlok kihagyása

inf · 2009. Ápr. 16. (Cs), 02.56
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:
RewriteRule images/page\.(\w+)\.jpg view/images/$1.jpg [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.
 
1

Vicc

inf · 2009. Ápr. 16. (Cs), 03.50
Ami már igazán vicc számba megy, az az, hogy így meg működik:
RewriteRule ^images/page\.(\w+)\.jpg$ view/images/$1.jpg [NC,L]
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.
2

RewriteCond

janoszen · 2009. Ápr. 16. (Cs), 07.53
Miért nem használsz RewriteCondot az ilyen problémák megoldására?

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. :)
4

Aham

inf · 2009. Ápr. 16. (Cs), 14.59
Persze, gondolom, hogy ha átírom az uri-t, hogy egy könyvtárra mutasson a semmi helyett, akkor újra lefut a cucc arra a bizonyos könyvtárra is. Ehhez nem kell megnéznem a forrását. Viszont ez szerintem tervezési hiba. Szerintem a logikus az lenne, ha egy htaccess fájl csak egyszer futna le, max ha van N is benne, akkor többször.
(C-hez sajnos nem értek :-))

A végleges verzió ez lett:
RewriteRule ^images/design/(\w+)/?$ view/downloads/images/$1.jpg [NC,L]
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.
6

Nem logikus

janoszen · 2009. Ápr. 16. (Cs), 18.45
Nem jogos amit írsz, hiszen az Apache-projektben dolgozók arra készítették föl a modult, hogy a több ember is dolgozhat egy helyre, ergo az egyik könyvtár tulajdonosa nem biztos, hogy tud a másikban végrehajtott változásokról.

Egyébként mint mondottam, érdemes a szabályok elé feltételt tenni, anélkül félkarú óriás.
8

Nem értem

inf · 2009. Ápr. 16. (Cs), 20.50
Ezt nem teljesen értem. Ez miért indokolja azt, hogy ugyanaz a htaccess fájl többször lefusson, és felülírja a már módosított elérési utat?
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?
10

Példák

janoszen · 2009. Ápr. 16. (Cs), 23.03
Tfh az adam nevü könyvtárból csinálsz egy rewrite rulet a bela nevü könyvtárra. A bela nevü könyvtárban viszolt van egy htaccess file, ami a cecilia könyvtárra mutat. Ez csak úgy tud működni, hogy a ruleokat addig követi, amíg egy termináló ponthoz nem érkezik (tovább nem követhető szabály vagy [L] rule.

Ami a kérdésedet illeti, valahogy így oldanám meg. (Nem ellenőriztem, telefonról pötyögök. :)

RewriteCond %{REQUEST_URI} !^/images [OR]
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.
11

Megnézem

inf · 2009. Ápr. 17. (P), 03.47
Tfh az adam nevü könyvtárból csinálsz egy rewrite rulet a bela nevü könyvtárra. A bela nevü könyvtárban viszolt van egy htaccess file, ami a cecilia könyvtárra mutat. Ez csak úgy tud működni, hogy a ruleokat addig követi, amíg egy termináló ponthoz nem érkezik (tovább nem követhető szabály vagy [L] rule.

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.
12

Lol

inf · 2009. Ápr. 17. (P), 03.59
Haha, közben rájöttem, hogy mégsem értem, hogy működik a htaccess :-D

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]


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!
13

Egy-két dolog nem tiszta

inf · 2009. Ápr. 17. (P), 18.26
Öö maradt néhány dolog, ami nem tiszta nekem.
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.
14

REQUEST_URI

Poetro · 2009. Ápr. 17. (P), 18.35
RewriteCond %{REQUEST_URI} !^/view/downloads/(images|css|js)/ [OR]
Ha kiveszed a /-t azaz
^view/downloads/(images|css|js)/
Akkor a ^ 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.
15

És felette?

inf · 2009. Ápr. 17. (P), 19.30
Ez így okés, de felette nem raktam / jelet az images elé, és mégis megy. akkor most hogy van ez, ott nem kezdődik / jellel az uri, vagy nem is azt kapja meg?

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.
16

rewritelog?

gex · 2009. Ápr. 17. (P), 20.14
Semmi lehetőségem nincs közben kiírni, hogy éppen hogy áll az átírási folyamat.
rewritelog nem elég?
17

Hogy ilyen is van

inf · 2009. Ápr. 18. (Szo), 06.32
Nem tudtam róla, hogy ilyen is van, yepp ez segít, kösz.
18

rewriteloglevel

gex · 2009. Ápr. 18. (Szo), 06.36
a rewriteloglevellel pedig beállíthatod, hogy mennyire részletesen logolja az átírásokat. az 5-ös szerintem már elég sok infot ad, de elmehetsz egészen 9-ig.
19

Ahm

inf · 2009. Ápr. 18. (Szo), 09.46
A 9 szerintem már túlzás, nem igazodok ki rajta, az 5 az pont jó.
3

Nézd meg itt talán segít:

rrd · 2009. Ápr. 16. (Cs), 09.34
Nézd meg itt talán segít: WebMánia
5

Kösz

inf · 2009. Ápr. 16. (Cs), 15.00
Köszi, megnézem, de nem hiszem, hogy sokat segítene, mivel angolul már egyszer elolvastam. Azért a magyart jobban szeretem :)
7

Guide

yaanno · 2009. Ápr. 16. (Cs), 20.04
A doksik mellé szoktak adni egy guide-ot is, amiben elég jól használható ötletek vannak gyakorlati problémákra.
9

Ok

inf · 2009. Ápr. 16. (Cs), 20.50
Köszszépen, megnézem ezt is.