[apache] vreemd mod_rewrite probleem.

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Op dit moment werk ik met een webapplicatie die altijd gebruik maakt van de volgende url's:

/index.php?module=module_name

Waar module_name uiteraard de naam is van de betreffende module. Nu leek het mij voor de eenvoud wel handig om hier een simpele mod_rewrite bij te gebruiken, zodat je als URL voortaan /module_name kunt gebruiken. Ik heb de volgende RewriteRule gemaakt:

code:
1
RewriteRule ^(.*)$ index.php?module=$1


Als ik vervolgens de url /module_name oproep, krijgt index.php als module altijd index.php opgegeven. Het script reageert dus alsof de url /index.php?module=index.php wordt aangeroepen.

Kan iemand mij vertellen waar het fout gaat? Dit lijkt me ongeveer de eenvoudigste RewriteRule die er zou moeten zijn, en toch gaat het mis.

Ik ontken het bestaan van IE.


Verwijderd

Hierdoor kom je in een oneindige loop terecht. Dit is gewoonweg onmogelijk (zover ik weet iig).

Gebruik een subdirectory om dit te omzeilen.
code:
1
RewriteRule ^cms/(.*)$ index.php?module=$1

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Dat verandert het probleem enigszins, maar lost het niet op.

Ik had het geheel al in een subdirectory gezet, dus heb ik nu maar het .htaccess bestand verplaatst naar de hoofddirectory, en de RewriteRule aangepast, maar nu krijg ik alleen maar de melding dat het niet gevonden wordt omdat het bestand niet gevonden wordt.

code:
1
2
RewriteEngine on
RewriteRule ^blabla/(.*)$ blabla/index.php?module=$1


Dit staat dus in de parentdirectory van blabla.

Ik ontken het bestaan van IE.


  • semicolon
  • Registratie: Mei 2004
  • Niet online
Kijk eens naar RewriteCond ? Je hebt nu namelijk wel regels maar die regels worden -altijd- uitgevoerd, maar ze hoeven niet uitgevoerd te worden als het bestand bestaat (bijvoorbeeld index.php, als die aangeroepen wordt hoeft er geen RewriteRule uitgevoerd te worden).

:D/-<


  • Mennootje
  • Registratie: December 2000
  • Laatst online: 22-09-2025
Inderdaad een RewriteCond toepassen die checkt of het bestand bestaat:

code:
1
RewriteCond %{REQUEST_FILENAME} !-f


%{REQUEST_FILENAME} is de string waar RewriteCond op test, !-f is hier de voorwaarde dat de string geen bestaand bestand is.

  • lennartkocken
  • Registratie: September 2004
  • Laatst online: 14:45
Of alle mogelijkheden in .htaccess apart neerzetten, en niet (.*)

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Mennootje schreef op zaterdag 19 augustus 2006 @ 23:25:
Inderdaad een RewriteCond toepassen die checkt of het bestand bestaat:

code:
1
RewriteCond %{REQUEST_FILENAME} !-f


%{REQUEST_FILENAME} is de string waar RewriteCond op test, !-f is hier de voorwaarde dat de string geen bestaand bestand is.
Hier zie ik geen logica in. blabla/module_name bestaat sowieso niet, dus de regel moet ook gewoon altijd worden uitgevoerd. Ik heb voor de zekerheid toch de regel toegevoegd, maar zonder enig resultaat.

Sowieso is het straks niet meer de bedoeling index.php direct aan te roepen, dit bestand wordt toch altijd met een module aangeroepen.

Ik ontken het bestaan van IE.


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
lennartkocken schreef op zaterdag 19 augustus 2006 @ 23:32:
Of alle mogelijkheden in .htaccess apart neerzetten, en niet (.*)
Liever niet. De modules zijn weer afhankelijk van de database, en uit veiligheidsoverwegingen kan de webapplicatie de .htaccess niet aanpassen.

Ik ontken het bestaan van IE.


  • Mennootje
  • Registratie: December 2000
  • Laatst online: 22-09-2025
cyberstalker schreef op zaterdag 19 augustus 2006 @ 23:35:
[...]

Hier zie ik geen logica in. blabla/module_name bestaat sowieso niet, dus de regel moet ook gewoon altijd worden uitgevoerd. Ik heb voor de zekerheid toch de regel toegevoegd, maar zonder enig resultaat.

Sowieso is het straks niet meer de bedoeling index.php direct aan te roepen, dit bestand wordt toch altijd met een module aangeroepen.
Jij gaf aan dat /index.php?module=index.php wordt aangeroepen. De logische verklaring hiervoor is dat /index.php gerewrite wordt naar die url. Die RewriteCond gaat dat tegen.

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

ℓℓ👌

Dit kan toch ook makkelijk zonder mod_rewrite ?

Ik snap niet echt waarom je dat nu moet gebruiken hoor.

don't be afraid of machines, be afraid of the people who build and train them.


  • mithras
  • Registratie: Maart 2003
  • Niet online
cyberstalker schreef op zaterdag 19 augustus 2006 @ 23:35:
[...]

Hier zie ik geen logica in. blabla/module_name bestaat sowieso niet, dus de regel moet ook gewoon altijd worden uitgevoerd. Ik heb voor de zekerheid toch de regel toegevoegd, maar zonder enig resultaat.

Sowieso is het straks niet meer de bedoeling index.php direct aan te roepen, dit bestand wordt toch altijd met een module aangeroepen.
De conditie zegt alleen dat als het bestand bestaat (bijv. index.php) er geen rewrite wordt uitgevoerd. Echter met een request index.php?module=iets, zal er wel gerewrite worden.
--hier stond iets doms 8)7 --

[ Voor 10% gewijzigd door mithras op 19-08-2006 23:54 ]


  • semicolon
  • Registratie: Mei 2004
  • Niet online
k8skaaay schreef op zaterdag 19 augustus 2006 @ 23:51:
Dit kan toch ook makkelijk zonder mod_rewrite ?

Ik snap niet echt waarom je dat nu moet gebruiken hoor.
Ik snap echt niet waarom je het nodig vond dit hier te zeggen?

Jij hebt het waarschijnlijk over MultiViews, nou ik kan het kort zeggen, met mod_rewrite kun je zelf alles bepalen, en specifieker zijn met de requests. Nu wordt er in dit voorbeeld van de TS geen gebruik van gemaakt -maar het kan wel-.

:D/-<


  • semicolon
  • Registratie: Mei 2004
  • Niet online
Mithras86 schreef op zaterdag 19 augustus 2006 @ 23:53:
[...]
De conditie zegt alleen dat als het bestand bestaat (bijv. index.php) er geen rewrite wordt uitgevoerd. Echter met een request index.php?module=iets, zal er wel gerewrite worden.
Waarom gebruik je verder niet, als je altijd naar index.php?module=iets verwijst, niet gewoon:
code:
1
RewriteRule ^index.php?module=(.*)$ index.php?module=$1
:?
Het idee is dat /module_naam ge-rewrite wordt naar index.php?module=$1
Die rewriterule die jij gaf doet vrij weinig ...

-edit k*t was vergeten dat ik net al gecomment had :p srry voor dubbelpost.

[ Voor 6% gewijzigd door semicolon op 19-08-2006 23:55 ]

:D/-<


  • Mennootje
  • Registratie: December 2000
  • Laatst online: 22-09-2025
Het enigste wat ik nog toe te voegen heb is dat onderstaande .htaccess prima doet wat jij wil. De index.php staat in dezelfde map als de .htaccess

code:
1
2
3
4
RewriteEngine On

RewriteCond %{REQUEST_FILENAME}                 !-f
RewriteRule ^(.*)$      index.php?page=$1       [L]

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
OK, ik ben een stuk verder nu:

code:
1
2
3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z]*)\?(.*)$ index.php?module=$1&$2
RewriteRule ^([a-zA-Z]*)$ index.php?module=$1


Dit heb ik gewoon weer in de subdirectory gezet waar het bewuste index.php bestand staat. Als ik simpel een module wil aanroepen gaat het prima. De bovenste regel is echter voor als ik nog data moet sturen aan de bewuste module.

Ik match daar dus bewust de eerste ? in de querystring niet, omdat ik dat natuurlijk moet omzetten naar een & . Bij deze queries gaat het echter nog compleet mis.

Ik ontken het bestaan van IE.


  • semicolon
  • Registratie: Mei 2004
  • Niet online
cyberstalker schreef op zondag 20 augustus 2006 @ 00:02:
OK, ik ben een stuk verder nu:

code:
1
2
3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z]*)\?(.*)$ index.php?module=$1&$2
RewriteRule ^([a-zA-Z]*)$ index.php?module=$1


Dit heb ik gewoon weer in de subdirectory gezet waar het bewuste index.php bestand staat. Als ik simpel een module wil aanroepen gaat het prima. De bovenste regel is echter voor als ik nog data moet sturen aan de bewuste module.

Ik match daar dus bewust de eerste ? in de querystring niet, omdat ik dat natuurlijk moet omzetten naar een & . Bij deze queries gaat het echter nog compleet mis.
Haal de eerste RewriteRule voor je QueryString weg, en zet achter de andere [QSA] neer. Dit staat voor Query String Append en voegt de Query String dus mee.
'qsappend|QSA' (query string append)
This flag forces the rewrite engine to append a query string part of the substitution string to the existing string, instead of replacing it. Use this when you want to add more data to the query string via a rewrite rule.
bron: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

Oftewel:
code:
1
2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z]*)$ index.php?module=$1 [QSA]

[ Voor 21% gewijzigd door semicolon op 20-08-2006 00:07 ]

:D/-<


Verwijderd

cyberstalker schreef op zaterdag 19 augustus 2006 @ 23:03:
code:
1
2
RewriteEngine on
RewriteRule ^blabla/(.*)$ blabla/index.php?module=$1


Dit staat dus in de parentdirectory van blabla.
Je moet misschien helemaal geen directory blabla aanmaken? En de index.php zet je gewoon in de root neer. Laat de rest maar over aan MOD_REWRITE. ;)

Zoals ik al zei:
code:
1
2
RewriteEngine on
RewriteRule ^blabla/(.*)$ index.php?module=$1
Pagina: 1