[Apache] mod_rewrite rule (regex)

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

Onderwerpen


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik wil mijn website ombouwen, zodat deze mooie URL's gebruikt. Ik ben dit nu aan het testen op mijn thuisserver en gebruik o.a. mod_rewrite met (na lang zoeken) de volgende rules:
code:
1
2
3
4
5
6
7
8
<IfModule mod_rewrite.c>
  RewriteEngine on

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} ^/site1/(.*)$
  RewriteRule ^(.*)$ /site1/index.php?q=$1 [L,QSA]
</IfModule>

Als ik dus surf naar http://localhost/site1/fruit/appels/elstar, wordt dit herschreven naar http://localhost/site1?q=fruit/appels/elstar. Ik wil alleen 2 uitzonderingen:
  • http://localhost/site1/images moet niet worden omgezet naar http://localhost/site1/index.php?q=images maar naar http://localhost/sites/localhost.site1/images (een fysieke directory). Dus ook http://localhost/site1/images/gotlogo.png moet worden herschreven naar http://localhost/sites/localhost.site1/images/gotlogo.png en niet naar http://localhost/site1/index.php?q=images/gotlogo.png
  • hetzelfde geldt voor de files directory: http://localhost/site1/files/word/gotpost.doc moet worden herschreven naar http://localhost/sites/localhost.site1/files/word/gotpost.doc en niet naar http://localhost/site1/index.php?q=files/word/gotpost.doc
Ik heb dus een regex pattern nodig die scant of de eerste dir in de URL "images" of "files" is. Zo ja, dan moet hij alles pakken wat daarachter staat en dit omzetten naar:
code:
1
2
3
4
5
# voor images:
/sites/localhost.site1/images/{alles_wat_achter_images_stond}

# voor files:
/sites/localhost.site1/files/{alles_wat_achter_files_stond}

Voor de duidelijkheid: http://localhost/site1/eerst/andere/dirs/en/dan/images moet niet worden omgezet; alleen omzetten als de eerste "dir" na "site1/" "images" of "files" is.

Ik hoop dat ik duidelijk ben in mijn vraag. Na lang proberen kwam ik zelf uit op
code:
1
RewriteRule ^images/([^/\.]+)/?$ /sites/localhost.site1/images/$1 [L]

Maar deze werkt niet. Ik wordt dan toch geredirect naar index.php?q=images. Wie kan mij verder helpen?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Volgens mij kun je daar toch heel simpel:
code:
1
RewriteRule ^/images/(.*)  /sites/localhost.site1/images/$1  [L]


Let ook even op de slash voor 'images' en 'sites', afhankelijk van je configuratie moeten die er allebei wel of allebei niet staan.

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik heb nu o.a. het volgende in mijn .htaccess:
code:
1
2
3
4
5
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} ^/site1/(.*)$
  RewriteRule ^/images/(.*) /sites/localhost.site1/images/$1 [L]
  RewriteRule ^(.*)$ /site1/index.php?q=$1 [L,QSA]

Als ik nu naar http://localhost/site1/images/logo.jpg surf, krijg ik een 500 internal server error. Als ik de laatste RewriteRule uitcomment, en naar dezelfde URL surf, verspringt de pagina naar http://localhost. Wat gaat er hier fout?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

Ik ben (nog) geen mod_rewrite expert, maar je gebruikt twee keer de [L]
En de [L] staat voor het feit dat dat de laatste rule is, die mod_rewrite / apache moet uitvoeren.

Ik snap niet, dat als je een paar rules hebt staan en het werkt
en je voegt 1 rule toe, dan krijg je internal error 500, prima, maar als je diezelfde rule uitcomment, dat hij dan naar localhost gaat. Daar is iets vreemds aan de hand.

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Verwijderd schreef op donderdag 20 september 2007 @ 08:19:
Ik ben (nog) geen mod_rewrite expert, maar je gebruikt twee keer de [L]
En de [L] staat voor het feit dat dat de laatste rule is, die mod_rewrite / apache moet uitvoeren.
Klopt, maar alleen als de rule uitgevoerd wordt. Dus daar zit het probleem niet.

je kunt dus rustig dit hebben:
code:
1
2
RewriteRule ^/images    -   [L]
RewriteRule ^/js - [L]

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Heeft iemand anders nog een idee?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
* kick * :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

Je laatste rule kent geen condities. Die slokt waarschijnlijk alles op door in een loopje alles te blijven rewriten.

Beste oplossing:
Rewrite alle URL's naar een PHP script, en laat dat script alles uitzoeken. Ga dus niet met query string dingen aan de gang, laat dat lekker aan je scripts over. Je scripts moeten die URL's kunnen genereren, dan is het ook niet zo gek als je scripts zelf die URL's moeten kunnen analyseren.

Dan hoef je dus maar één set met condities te maken, en houd je één RewriteRule over, met daarvoor wat RewriteCond dingen.

En ik heb zo het idee dat /sites/localhost.site1 een fysieke directory is de root van je filesystem, of niet? Het zou in dit geval zo moeten zijn dat /sites een subdirectory is van je webroot directory.
Pagina: 1