[Mod_rewrite] ? vervangen door &

Pagina: 1
Acties:

  • MrQcue
  • Registratie: Januari 2005
  • Laatst online: 13-01 08:55
Hoi,

ik ben bezig om mbv een mod_rewrite/regex mijn url klaar te maken voor een taalwissel.

Dit is wat ik toe nu toe heb.

RewriteEngine On
RewriteBase /
RewriteRule ^en/(.*).html?(.*)$ $1.php?l=en&$2

Mijn bedoeling is dus om van bijv:

www.domein.nl/en/index.html -> www.domein.nl/index.php?l=en

te maken.

Echter zou ik extra parameters ook gewoon via de url willen meesturen. Normaal gesproken ziet dat er dan bij mij alsvolgt uit:

www.domein.nl/en/index.html?cat=koelkasten -> www.domein.nl/index.php?l=en&cat=koelkasten

Ik wil graag op deze manier extra parameters meesturen en niet mbv mod rewrite als dit /id/id/

Wat ik dus probeer in bovenstaand voorbeeld is om van de eerste parameter -> '?cat=koelkast' in de rewrite te vertalen naar &cat=koelkast achter de taal variable in de url.

Ik heb behoorlijk wat afgezocht maar overal waar ik kijk zie ik voorbeelden op basis van url met /id/id/id

Bovenstaand voorbeeld geeft variable $_GET['cat'] niet terug. De variable $_GET['l'] komt wel netjes naar binnen rollen.

Ik hoop dat iemand mij kan vertellen wat ik hier nu fout doe. :)

Verwijderd

In dit soort gevallen kun je het best je PHP script de variabelen uit de request URI laten halen Dezelfde PHP applicatie zal toch ook de URI's moeten genereren naar andere pagina's. Ik vind dus dat de logica om URI's te kunnen ontleden dan ook bij het PHP script moet liggen. Zo doe ik dat ook. Alle mogelijke URI's rewriten naar een enkel PHP script, dat de waarden uit de URI haalt, en dan naar het juiste stuk script dispatcht.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Je hebt de volgende regex nu:
code:
1
RewriteRule ^en/(.*).html?(.*)$ $1.php?l=en&$2

Je gebruikt daarin een ? als uitleesbare karakter, maar bij regular expressions hebben die vraagtekens een speciale betekenis, namelijk mag wel of niet voorkomen. als je hem als karakter wilt gebruiken moet je hem escapen. Dit kan door er een \ voor te zetten.

Dan krijg je het volgende:
code:
1
RewriteRule ^en/(.*).html\?(.*)$ $1.php?l=en&$2

Maar de vraagteken achter de html kan ook niet voorkomen, dus moet achter dat stuk een ? komen, want het kan wel en niet voorkomen, zo ja, dan moet hij op plek $2 erbij worden gezet.

Dan krijg je het volgende:
code:
1
RewriteRule ^en/(.*).html(\?(.*))?$ $1.php?l=en&$2

Niet getest, maar denk wel dat het werkt (ik kan wat over het hoofd zien).

Maar nu heb je en hardcoded erin. Dit kan je veel beter oplossen door ook de taal als variable te gebruiken. Dit zou je als volgt kunnen oplossen:
code:
1
2
3
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*?)/(.*).html(\?(.*))?$ $2.php?l=$1&$3

[ Voor 15% gewijzigd door eghie op 09-08-2006 18:45 ]


  • MrQcue
  • Registratie: Januari 2005
  • Laatst online: 13-01 08:55
DANK voor de snelle reacties!

Ik doe vast iets fout maar ik krijg van apache nu een internal server-error...

Het ziet er idd. wel goed uit volgens mij....

Ik zal het nog even proberen

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Die internal server fout geeft hij als hij of de regular expressie niet kan parsen of de hele config.

Maar ik ben het wel eens met Cheatah (vergeten te melden). Zoals Cheatah het voorsteld is het makkelijker en je hebt een hoop meer controlle over de "rewrites".

  • semicolon
  • Registratie: Mei 2004
  • Niet online
Overige parameters zeg je, kijk eens naar de optie QSA :)
'qsappend|QSA' (query string append)

in de manual.

:D/-<


  • MrQcue
  • Registratie: Januari 2005
  • Laatst online: 13-01 08:55
Toch vreemd dat hij het niet kan parsen... het ziet er toch goed uit volgens mij. Ik ben hem wat aan het ontleden om te kijken welk stukje niet geparsed kan worden.

Ik zou het ook in php kunnen doen maar als dit werkt dan zou dit een hele mooie oplossing zijn.

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

NMe

Quia Ego Sic Dico.

Laat hem eens redirecten in plaats van rewriten, ik denk dat je een oneindige loop hebt gemaakt, en met een redirect kun je dat zien (althans, in Firefox, wat IE doet weet ik zo niet).

Verder lijkt het me een beetje loos om, als je toch al met mod_rewrite bezig bent, alsnog een querystring in je uri's te laten staan. Waarom niet een complete url maken zonder querystring? :)

Daarnaast valt mod_rewrite onder Apache-configuratie, en dat heeft niets met programmeren te maken. Zie ook Waar hoort mijn topic? :)

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.


  • MrQcue
  • Registratie: Januari 2005
  • Laatst online: 13-01 08:55
Ik heb nu het volgende icm met een conditie die kijkt of er een parameter komt -> '?'

code:
1
2
RewriteCond %{REQUEST_URI}  ^.*.html?$
RewriteRule ^en/(.*).html(.*)$ $1.php$2 [L]


Dit werkt maar nu mis ik nog mijn l(anguage) parameter.

Als ik die er hard achter plak, zoals dit:

code:
1
2
RewriteCond %{REQUEST_URI}  ^.*.html?$
RewriteRule ^en/(.*).html(.*)$ $1.php$2&l=en    [L]


Dan werkt het niet meer.... Vaag :?

Heeft iemand een idee?

  • semicolon
  • Registratie: Mei 2004
  • Niet online
Nogmaals, pak zoals je het eerst had (toen het normaal werkte) en kijk naar QSA in de mod_rewrite handleiding.
Die optie is gemaakt om te doen wat jij wilt.

[ Voor 8% gewijzigd door semicolon op 09-08-2006 20:17 ]

:D/-<


  • MrQcue
  • Registratie: Januari 2005
  • Laatst online: 13-01 08:55
Hartstikke toppie!!!! _/-\o_ _/-\o_ _/-\o_

De oplossing voor mijn probleem zal ik even met jullie delen:
code:
1
RewriteRule ^en/(.*).html $1.php?l=en [QSA,PT]



Dank voor jullie hulp!
Pagina: 1