apache2, <del>rewrite</del> dir, 301

udvozlet!

szerk: redukaljuk a problemat:
apache(2) azt csinalja alapbol (legalabbis debian/lenny alatti alapertelmezett beallitas, de mashol is lehet latni), hogy egy

http://vala.hol/konyv/tar

cim begepeleskor egy R=301-el ter vissza, es atiranyit a

http://vala.hol/konyv/tar/

cimre, majd teszi a dolgat tovabb (directoryindex, listing, stb). ezt hogyan lehet kikapcsoni a fenebe? (azaz az apache csak siman tegye a dolgat, es ne terjen vissza R=301-gyel?)

erdeti problemakor: (( a problema-sorozat a kovetkezo", ha valaki tudna segiteni es/vagy latott ilyesmit:
1. (hatter) talan ismert jelenseg: apache(2) azt csinalja alapbol (legalabbis debian/lenny alatti alapertelmezett beallitas, de mashol is lehet latni), hogy egy

http://vala.hol/konyv/tar

cim begepeleskor egy R=301-el ter vissza, es atiranyit a

http://vala.hol/konyv/tar/

cimre, majd teszi a dolgat tovabb (directoryindex, listing, stb).
2. (hatter, kozelebb a problemahoz) mod_rewrite: egy teljes

RewriteRule ^(.*)$ ...

direktivanak az lenne a dolga, hogy minden kerest felulirjon ugy, ahogy. pl erre, hogy

index.php?query=$1 [L,QSA]

, ez oke.
3. (megkozelebb a problemahoz) ha $1 egy letezo" file kiterjesztes nelkul, akkor ezt a fentebbi rewrite-t nem hajtja vegre. oke, ez kikapcsolhato egy

-MultiViews

opcioval.
4. (a problema) azt kellene csinalni, hogy a fentebbi rewrite-t egy

/static

konyvtar kivetelevel kene megcsinalni. nosza:

RewriteCond %{REQUEST_URI} !^/static/.*$

. ez teljesen jo, leszamitva hogy a

/static

(a vegen / nelkul) kivetelevel nem mukodik. ez viszont nagyon nem: a (3) pont ellenere az (1) pont me'g eletben van, a (2)-t pedig reszlegesen alkalmazva egy teljesen patetikus

/static/?query=static

-t ad vissza a rewrite utan mindezt R=301-gyel (valoszinuleg biztos, mert a bongeszo url-jet felulirja), es a (4)-est barhogy kiegeszitve sem gyogyul meg, raadasul valahogy mintha osszetenne' a kis agya'ban a directoryindex opciot (i.e. tkp hogy a (2) pontban index.php-t adok meg az mindegy, lehetne akar az pl main.php is). kerdes: ezt hogyan lehet athidalni? ))
thx, a.

Hozzászólások

A problemat nem teljesen ertem, de amit leirtal, az nem bug, hanem feature, es a mod_dir nevu apache modul csinalja: ha a request egy konyvtar, ami letezik a filerendszeren, akkor nyom egy redirectet, majd ugyancsak a mod_dir megnezi, hogy van-e a konyvtarban olyan file, ami fel lett sorolva a directoryindex direktivaban. Ha van, akkor kiszolgalja, ha nincs, akkor jon a kovetkezo modul.

Amit 1-4ig leirtal nekem eleg kodos, ha megprobalod ujrafogalmazni, szerintem valaszt is fogsz kapni.

az nem bug, hanem feature, es a mod_dir nevu apache modul csinalja:
igen, sikerult ezt megtalalni:

DirectorySlash Off

, de az eredeti probleman nem segitett...:/

Amit 1-4ig leirtal nekem eleg kodos, ha megprobalod ujrafogalmazni, szerintem valaszt is fogsz kapni.
huh, igen, akkor ezt ujra: szoval a lenyeg az, hogy ha teljesul RewriteCond-ban megfogalmazott tagada's e's nincs a(z egyebkent letezo,

/static

nevu") konyvtar neve utan egy slash, akkor furcsa dolgot csinal: a

vala.hol/static

url-bo"l

vala.hol/static/?query=static

url-t csinal, me'g akkor is, ha a teljes konyvtarra ki van kapcsolva ez a

DirectorySlash

opcio...

egy apro problema elojott, a fentiekhez kapcsolodoan. van egy http://doma.in/page/ oldal, amiben van egy ilyen htaccess, egy mod_rewrite szaballyal kiegeszitve:


Options -Indexes
DirectorySlash Off

<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{REQUEST_URI} !^/page/static/.*$
        RewriteCond %{REQUEST_URI} !^/page/static$
        RewriteRule ^(.*)$ index.php?query=$1 [L,QSA]
</IfModule>

mindez teljesen jol mukodik, a http://doma.in/page/vala/mi kereseket forditja az index.php-nek, $_GET["query"]="/vala/mi"; ertekekkel. nomarmost ez az egesz nem mukodne, ha directoryslash be lenne kapcsolva (lasd eredeti problema, feljebb), tehat ez igy kell. az indexet is tiltjuk, biztonsagi okokbol, nyilvanvaloan.

egyetlen apro problema van: ha a felhasznalo azt irja be a bongeszobe, hogy http://doma.in/page. azaz nincs a page utan "/". ekkor a kliens kap egy 403:forbidden-t. nomarmost azt hogyan lehetne elerni, hogy igy is jol mukodjon? ha +Indexes van, akkor ilyenkor kilistazza a konyvtarat, amit nyilvan nem akarnank. ha eggyel feljoebb (doma.in virt host documentroot-jaba) teszek egy htaccess-t egy olyan mod_rewrite szaballyal hogy a /page uri-bol csinaljon /page/-t, akkor az hatastalan. otlet, erre? koszonettel, a.

up?

megneztem kozben hogy a nagyok hogy csinaljak: a drupal htaccess-enek pl olyan hatasa van, hogy egyreszt bekapcsolva hadja a directoryslash-t, viszont minden file-t kitilt. azaz ha http://doma.in/page/letezo/file-t irok be akkor dob egy access denied-et, viszont ha mondjuk http://doma.in/page/nemletezo/nemfile-t, akkor meg csinalja a standard processinget. ez meg utkozesekhez vezethet. pl ha veletlenul csinalna valaki egy drupal.hu/includes-t?