[mod_rewrite] Het lukt me niet...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 00:32
Ik ben al sinds gistermiddag aan het klooien en topics (en ook de FAQ hier op GoT) aan het doorlezen, maar ik kom er niet uit. Daarom dan maar weer eens een mod_rewrite-topic.

Wat ik wil doen is, volgens mij, tamelijk eenvoudig.

Ik wil van hier:
domein.com/foo/bar/12
hier komen:
domein.com/index.php?hoofdcat=foo&subcat=bar&id=12

Daarvoor heb ik zelf de volgende set rules "bedacht":
code:
1
2
3
4
5
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule \.(css|jpe?g|gif|png)$ - [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)(.*)$ ?hoofdcat=$1&subcat=$2&id=$3
</IfModule>


Maar, jullie raden het al, dit werkt niet. Het vervelende is dat ik gewoon niet snap waarom niet... Ik ben een stapje terug gegaan en heb dit wel aan de praat gekregen:

van hier:
domein.com/foo/bar/12
naar hier:
domein.com/index.php?hoofdcat=foo&subcat=bar

met de volgende rules:
code:
1
2
3
4
5
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule \.(css|jpe?g|gif|png)$ - [L]
RewriteRule ^([^/]*)/([^/]*)(.*)$ ?hoofdcat=$1&subcat=$2
</IfModule>


Het lullige is dat zelfs dit niet helemaal naar smaak werkt. Want ik wil dat dit ook werkt: domein.com/foo. En dat lukt dus niet, het werkt alleen als ik domein.com/foo/ doe (met een slash erachter dus). Ik snap dat dit komt doordat hij gaat zoeken naar een file met de naam foo, maar ik snap niet hoe ik dit moet fixen.

Op de Apache site staat dit citaat:
"Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. ''
Ik kan het daar alleen maar mee eens zijn. Wie helpt mij deze voodoo-magie te beheersen? Het gaat me dus niet alleen om een kant-en-klare oplossing, maar vooral om de uitleg erachter. Ik wil het heel graag snappen :)

omniscale.nl


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar hoort mijn topic?
[PRG] >> [WSS]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 00:32
Oeps, sorry... Ik zag een aantal andere mod_rewrite topics in PRG staan, dus ik dacht dat het wel snor zat.

omniscale.nl


Acties:
  • 0 Henk 'm!

Verwijderd

posttoast schreef op vrijdag 05 januari 2007 @ 18:17:

Het lullige is dat zelfs dit niet helemaal naar smaak werkt. Want ik wil dat dit ook werkt: domein.com/foo. En dat lukt dus niet, het werkt alleen als ik domein.com/foo/ doe (met een slash erachter dus). Ik snap dat dit komt doordat hij gaat zoeken naar een file met de naam foo, maar ik snap niet hoe ik dit moet fixen.
Nee, Apache gaat niet op zoek naar een file met de naam foo. Heel mod_rewrite vindt plaats voordat er naar het filesystem gekeken wordt. Het kan wel, maar dat moet je expliciet opgeven.

Je 3e regular expression klopt simpelweg niet met wat je wilt.
code:
1
RewriteRule ^([^/]*)/([^/]*)(.*)$ ?hoofdcat=$1&subcat=$2

Hier wil je kennelijk iets hebben dat:
- 1: Begint met nul of meer niet-slashes
- 2: Gevolgd door een slash
- 3: Gevolgd door nul of meer niet-slashes
- 4: Gevolgd door wat dan ook (overbodig)
- 5: Einde (ook overbodig)

Maar, wat gebeurt er dan met het pad /foo? De leading slash wordt eraf geknipt.
- 1: Hij begint met nul of meer niet-slashes (foo)
- 2: Maar niet gevolgd door een slash (niets)
De regex matcht dus niet, en er gebeurt niets.
code:
1
RewriteRule ^([^/]*)/([^/]*)/([^/]*)(.*)$ ?hoofdcat=$1&subcat=$2&id=$3

Hier wil je iets dat:
- 1: Begint met nul of meer niet-slashes
- 2: Gevolgd door een slash
- 3: Gevolgd door nul of meer niet-slashes
- 4: Gevolgd door een slash
- 5: Gevolgd door nul of meer niet-slashes
- 6: Gevolgd door wat dan ook (overbodig)
- 7: Einde (ook overbodig)

/foo/bar/12
- 1: Hij begint met nul of meer niet-slashes (foo)
- 2: Gevolgd door een slash (foo/)
- 3: Gevolgd door nul of meer niet-slashes (foo/bar)
- 4: Gevolgd door een slash (foo/bar/)
- 5: Gevolgd door nul of meer niet-slashes (foo/bar/12)
- 6: Gevolgd door wat dan ook (foo/bar/12)
- 7: Einde (foo/bar/12)

Deze zou dus wel moeten werken als de eerste dat ook doet.

Maar mijn advies: maak het liefst één regular expression die alles matcht wat je maar wilt, en rewrite naar één scriptbestand, zonder URL parameters. Laat de afhandeling van het analyseren van de URL over aan je script. Die moet de URL's tenslotte ook kunnen genereren.

Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 00:32
Verwijderd schreef op vrijdag 05 januari 2007 @ 21:39:
[...]
Hier staat een uitgebreide uitleg.
Cheatah, je bent geweldig! :) Perfecte reply, je lost niet alleen mijn probleem op maar ik snap nu ook eindelijk iets beter hoe dit allemaal werkt. Ik heb ooit tijdens mijn studie een vakje over logica gevolgd, maar de syntax van die regular expressions krijg ik op de één of andere manier maar niet onder de knie. Het is nu duidelijker geworden en ik ga me er nog wat verder in verdiepen.
Maar mijn advies: maak het liefst één regular expression die alles matcht wat je maar wilt, en rewrite naar één scriptbestand, zonder URL parameters. Laat de afhandeling van het analyseren van de URL over aan je script. Die moet de URL's tenslotte ook kunnen genereren.
Dit klinkt interessant, maar zou je me nog concreet kunnen vertellen wat je hiermee bedoelt?

Heb ik al gezegd dat je geweldig bent? :P

omniscale.nl


Acties:
  • 0 Henk 'm!

Verwijderd

posttoast schreef op vrijdag 05 januari 2007 @ 23:02:

Cheatah, je bent geweldig! :) Perfecte reply, je lost niet alleen mijn probleem op maar ik snap nu ook eindelijk iets beter hoe dit allemaal werkt. Ik heb ooit tijdens mijn studie een vakje over logica gevolgd, maar de syntax van die regular expressions krijg ik op de één of andere manier maar niet onder de knie. Het is nu duidelijker geworden en ik ga me er nog wat verder in verdiepen.
Regular expressions zijn er dan ook van heel simpel tot razend ingewikkeld. Het mooie van die expressions is dat je bepaalde zaken met enkele regels code kunt doen, waar je anders behoorlijk aan de gan zou moeten gaan met programmeren. Over het algemeen zijn de regular expressions die je voor mod_rewrite gebruikt vaak relatief eenvoudig.
Dit klinkt interessant, maar zou je me nog concreet kunnen vertellen wat je hiermee bedoelt?
Stel je maakt de volgende rewrite rules:
code:
1
2
3
RewriteEngine on
RewriteCond %{REQUEST_URI} !(template|content)
RewriteRule .* script.php

Voor alle request URI's waar niet "template" of "content" in het pad voorkomt, worden alle URI's omgeleid naar script.php.

In dat script controleer je de waarde van $_SERVER['REQUEST_URI'] en ga je zorgen dat de juiste handelingen worden gedaan om een pagina te tonen met de gewenste gegevens. Als je de code van je website handig opbouwt, heb je ongetwijfeld een stuk code dat verantwoordelijk zal zijn voor het genereren van URI's naar andere pagina's van je website om in de HTML te zetten. Het is dan ook logisch dat je een stuk code hebt dat het omgekeerde doet: een URI ontleden en uitzoeken wat er weergegeven moet worden. Als je dat zo doet, wordt de code van je website meer solide, en ben je minder afhankelijk van externe mechanismen (mod_rewrite). Dergelijke logica mag best in de code van je website.

Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 00:32
d:)b Helemaal goed. Ik ben weer lekker aan het spelen, en dat is altijd leuk. Bedankt!

omniscale.nl

Pagina: 1