Toon posts:

[Apache] mod rewrite images uitsluiten

Pagina: 1
Acties:
  • 268 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Tweakerts,

Ik ben bezig met een nieuwe site waarin ik gebruik maak van PHP om de pagina's te tonen. de opbouw is als volgt: ik heb een index.php waarin ik afhankelijk van de waarde van de variabele view een bepaalde pagina include. Vrij standaard dus.

Omdat dit toch lelijke links resulteert (bijv. index.php?view=home_home) wil deze urls rewriten d.m.v. de mod_rewrite module van apache. Hiervoor heb ik de volgende regels in mijn httpd.conf opgenomen:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f [NC] #bestand
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d [NC] #directory
RewriteRule /images/$ images/$2

RewriteRule /home /index.php?view=home_home
RewriteRule /login /index.php?view=home_login
-- en zo nog een aantal links

Ik wilde het zo simpel mogelijk houden omdat ik het voor mezelf simpel en duidelijk wil houden. Dit werkt op zich, dus de url localhost/home wordt omgezet naar localhost/index.php?view=home_home. Het probleem is echter dat bepaalde images niet meer weergegeven worden. Dit komt waarschijnlijk omdat apache de url van de images ook rewrite.

Afgaande op een ander topic heb ik de bovenste 2 rewrite condition opgenomen, maar dat verhelpt het probleem niet. Ook het opnemen van de baseref tag <BASE href="volledige link naar domein/"> voorkomt niet dat de plaatjes niet geladen worden.

Voor de duidelijkheid, ik wil dus alleen de urls rewriten waarin view voorkomt. Links naar images, css en andere bestanden moeten niet rewrite worden. Weten jullie wat ik fout doe?

Bedankt alvast!

  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 15-02 23:09

Koetjeboe

Boe, zegt de koe

Probeer die twee bovenste regels eens boven elke rewrite rule te zetten? Het zijn namelijk condities per rule...of je deze ook globaal kunt aangeven, dat weet ik niet.

[edit]
Hmm, misschien kun je zoiets proberen?

code:
1
2
3
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ $1 [L,QSA]


Oftewel, indien het een bestand/dir is (note de missende !), volg de url en kap ermee...

[edit2]
Even [OR] erbij :P

[ Voor 90% gewijzigd door Koetjeboe op 23-05-2006 20:24 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Wil je in het vervolg stickies lezen voordat je een topic opent in een bepaald subforum? In dit geval was je dan Waar hoort mijn topic? tegengekomen en dan had je geweten dat je in Windows Servers en Software had moeten zijn met je vraag. ;)

PRG>>WSS

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Koetjeboe schreef op dinsdag 23 mei 2006 @ 20:20:
Probeer die twee bovenste regels eens boven elke rewrite rule te zetten? Het zijn namelijk condities per rule...of je deze ook globaal kunt aangeven, dat weet ik niet.

[edit]
Hmm, misschien kun je zoiets proberen?

code:
1
2
3
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ $1 [L,QSA]


Oftewel, indien het een bestand/dir is (note de missende !), volg de url en kap ermee...

[edit2]
Even [OR] erbij :P
Ik heb het nu voor elkaar dat de url juist gerewrite worden als ik de volgende regels in mijn httpd.conf heb:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ $1 [L,QSA]

RewriteRule /home /index.php?view=home_home
RewriteRule /login /index.php?view=home_login
#nog meer url rewrites
</ifModule>

Omdat ik geen directe toegang tot de httpd.conf op de server waar de site "echt" gehost wordt heb ik dit in een .htacces bestand geplaats welke in de root van de webserver staat. Als ik dit doe werkt het weer niet, ik krijg alleen maar 404 errors. Weet een van jullie waarom niet?

Verwijderd

Topicstarter
Ik ben het nu voor elkaar dat hij de rewriting rules juist toepast als ik ze in een .htacces bestand plaatst. Dit heb ik opgelost door de trailing slash voor de rewritten pad weg te halen, dus dit:
code:
1
RewriteRule home /index.php?view=home_home

in plaats van dit:
code:
1
RewriteRule /home /index.php?view=home_home


Probleem is nu alleen weer dat hij bepaalde plaatjes niet laat zien.

Als ik naar de headers in de apache log kijk dan zie ik dat hij voor de plaatjes die weergegeven worden een 304 (not modified) header stuurt, terwijl hij voor de plaatjes die helemaal niet weergegeven worden een 200 (ok) header stuurt.

Zegt iemand dit iets?

Ter info: dit is nu de relevante inhoud van mijn .htacces bestand:
code:
1
2
3
4
5
6
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d     
RewriteRule ^(.*)$ $1 [L,QSA]

RewriteRule home /index.php?view=home_home


De bovenste regels zouden er voor moeten zorgen dat de urls naar plaatjes uit de map images niet rewritten worden, dit lijkt echter wel te gebeuren.

Verwijderd

Topicstarter
Kikkerdekik, niemand die een oplossing heeft?

Verwijderd

Topicstarter
Anyone?

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

code:
1
2
3
4
5
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d     
RewriteRule ^(.*)$ $1 [L,QSA]

RewriteRule home /index.php?view=home_home
Wat je hier doet is me een compleet raadsel. Je rewrite alle niet bestaande directies of files naar zichzelf; zegt dat het de laatste regel is; en vervolgens rewrite je alsnog 'home' naar een andere locatie. Dat kan toch nooit werken? Ga eens kijken naar de RewriteLog directive zodat je kan uitvogelen wat er nu precies gebeurt :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 15-02 23:09

Koetjeboe

Boe, zegt de koe

Spider.007 schreef op zondag 28 mei 2006 @ 10:29:
code:
1
2
3
4
5
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d     
RewriteRule ^(.*)$ $1 [L,QSA]

RewriteRule home /index.php?view=home_home
Wat je hier doet is me een compleet raadsel. Je rewrite alle niet bestaande directies of files naar zichzelf; zegt dat het de laatste regel is; en vervolgens rewrite je alsnog 'home' naar een andere locatie. Dat kan toch nooit werken? Ga eens kijken naar de RewriteLog directive zodat je kan uitvogelen wat er nu precies gebeurt :)
Nee, wat dat doet is alle bestaande (let op de missende '!') files en dirs negeren (aka redirecten naar zichzelf), dat was het stuk code wat ik heb gegeven.

Wat je met de volgende regel doet is alles met home erin naar index.php?view=home_home doorsturen, dus bijv

www.url.nl/home -> redirect naar index.php
www.url.nl/dgdgddfhomegdfgfdgfd -> redirect naar index.php
www.url.nl/ietsnietbestaands -> 404
www.url.nl/bestaandefileofdir -> redirect naar zichzelf

Heb het ook even op mijn server getest en dat werkt prima. Of je dat ook wou met die laatste
regel...?

[edit]
Momentje, werkt toch nog niet helemaal :P

[edit2]
Denk dat het komt doordat je {DOCUMENT_ROOT} en {REQUEST_FILENAME} gebruikt, bij mij werkt hij prima zonder de DOCUMENT_ROOT, wat ook logisch is omdat REQUEST_FILENAME de volledige local path is, wat wou je met de document_root bereiken?

[ Voor 21% gewijzigd door Koetjeboe op 28-05-2006 11:02 ]


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Koetjeboe schreef op zondag 28 mei 2006 @ 10:51:
[...]


Nee, wat dat doet is alle bestaande (let op de missende '!') files en dirs negeren (aka redirecten naar zichzelf), dat was het stuk code wat ik heb gegeven.
Evenwel is het doel even nutteloos; redirecten naar zichzelf is niet hetzelfde als negeren; slimmer is om de logica om te gooien (inderdaad; de vergeten '!') en dus iets als dit te gebruiken (wat ook redelijk common is volgens mij):
code:
1
2
3
4
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule home /index.php?view=home_home
[edit2]
Denk dat het komt doordat je {DOCUMENT_ROOT} en {REQUEST_FILENAME} gebruikt, bij mij werkt hij prima zonder de DOCUMENT_ROOT, wat ook logisch is omdat REQUEST_FILENAME de volledige local path is, wat wou je met de document_root bereiken?
Waarom die erin staat weet ik ook niet; maar die kwam dan ook oorspronkelijk van de TS vandaan en ik gok dat die hem ook maar ergens vandaan heeft gekopieert?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 15-02 23:09

Koetjeboe

Boe, zegt de koe

Spider.007 schreef op zondag 28 mei 2006 @ 15:49:
[...]
Evenwel is het doel even nutteloos; redirecten naar zichzelf is niet hetzelfde als negeren; slimmer is om de logica om te gooien (inderdaad; de vergeten '!') en dus iets als dit te gebruiken (wat ook redelijk common is volgens mij):
code:
1
2
3
4
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule home /index.php?view=home_home

[...]

Waarom die erin staat weet ik ook niet; maar die kwam dan ook oorspronkelijk van de TS vandaan en ik gok dat die hem ook maar ergens vandaan heeft gekopieert?
Het doel is niet helemaal nutteloos, die RewriteCondities moet je voor elke rule zetten...toch? Lijkt me mijn oplossing makkelijker in het geval van meerdere rewriterules waarbij je voor alle die condities wilt laten gelden? Het klopt natuurlijk dat het niet 'negeren' in de letterlijke zin van het woord is maar het effect is hetzelfde toch... of weet jij een manier waarop je condities voor alle rules kunt laten gelden? (Heb het niet echt kunnen vinden maar kan ook dat ik gewoon stom over de documentatie waar het staat heen lees)

Voor die 2e, die was ook op de TS gericht :P Gok ook iets van kopieer werk maar het lijkt me dus compleet fout
Pagina: 1