Toon posts:

[Apache] mod-rewrite en 'lege velden' in url

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

Verwijderd

Topicstarter
Ik kom er met mod-rewrite (in .htaccess overigens) niet helemaal uit. Ik heb in de faq dit voorbeeld gezien:

code:
1
2
3
RewriteEngine On
RewriteBase /rewrite-test/
RewriteRule ^index/([0-9]+)/([0-9]+)$ index.php?piet=$1&sjaak=$2


Dat werkt ook allemaal wel, maar nu heb ik een script waarbij ik wil dat het niet per se nodig is om 'piet' mee te geven dus ik doe dit:

code:
1
2
3
RewriteEngine On
RewriteBase /rewrite-test/
RewriteRule ^index/([0-9]*)/([0-9]+)$ index.php?piet=$1&sjaak=$2


Maar dat werkt dus niet, wat doe ik fout?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 18 juli 2007 @ 16:13:
Maar dat werkt dus niet, wat doe ik fout?
In ieder geval dit: Waar hoort mijn topic? :Y)

PRG >> WSS

Verder, hoe zie je het dan voor je? Met twee slashes in de URL ofzo? Kun je het dan niet beter omdraaien?

[ Voor 11% gewijzigd door RobIII op 18-07-2007 16:18 ]

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


Verwijderd

Topicstarter
RobIII schreef op woensdag 18 juli 2007 @ 16:15:
[...]

Verder, hoe zie je het dan voor je? Met twee slashes in de URL ofzo? Kun je het dan niet beter omdraaien?
Inderdaad een dubbele slash in de url ja. Omdraaien gaat niet lukken omdat ik ook scripts heb waarbij er meerdere velden niet per se hoeven worden ingevuld. Dan zou een oplossing een lange query-string zijn maar dat doe ik liever niet :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 18 juli 2007 @ 16:21:
[...]

Inderdaad een dubbele slash in de url ja.
Dan werkt het toch zoals jij het aangeeft? Of snap ik het nou niet?

http://www.blah.com/index/999/111 -> index.php?piet=999&sjaak=111
http://www.blah.com/index//111 -> index.php?piet=&sjaak=111

[ Voor 27% gewijzigd door RobIII op 18-07-2007 16:34 ]

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


Verwijderd

Topicstarter
Ja ik had ook verwacht dat het gewoon zou werken maar niet dus :) Hij pakt de RewriteRule gewoon niet omdat hij daar op de 1 of andere manier blijkbaar niet aan voldoet :?

  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06-2025
Verwijderd schreef op woensdag 18 juli 2007 @ 16:13:
Dat werkt ook allemaal wel, maar nu heb ik een script waarbij ik wil dat het niet per se nodig is om 'piet' mee te geven dus ik doe dit:

code:
1
2
3
RewriteEngine On
RewriteBase /rewrite-test/
RewriteRule ^index/([0-9]*)/([0-9]+)$ index.php?piet=$1&sjaak=$2


Maar dat werkt dus niet, wat doe ik fout?
Tsja, dat zou ik dus ook wel eens willen weten en om eerlijk te zijn dacht ik dus ook dat het zou moeten werken - dus ff mijn PowerBookje geherconfigureerd zodat ik een extra test.local website heb die via de .htaccess de mod_rewrite statements snapt :).

Op het eerste gezicht is er niets mis met je code, maar na een kwartier (oid) expirimenteren ging me ineens een lichtje op, ik zal de foutive tekst ff highlighten:
RewriteRule ^index/([0-9]*)/([0-9]+)$ index.php?piet=$1&sjaak=$2

Wat je hier probeert te bereiken is het matchen van een parameter, die er niet is... Direct gevolg is dat de hele regel niet meer geldig is.

Het is echter wel degelijk mogelijk om dit te doen, maar dan moet je de gehele parameter optioneel maken. Wat er uiteindelijk uitgekomen is, dat is het volgende:
code:
1
2
3
RewriteEngine On
RewriteBase /rewrite-test/
RewriteRule ^index/([0-9]+)?/([0-9]+)$ index.php?piet=$1&sjaak=$2


Het vraagtekentje maakt de gehele parameter optioneel en niet alleen de mogelijke inhoud van die parameter...

Voor de volledigheid nog even wat handige linkjes:

Verwijderd

Best practice: rewrite alle url's die je script moet verwerken naar dezelfde url, analyseer de URL met PHP en dispatch naar het juiste script/stuk code.

  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06-2025
Als aanvulling op de opmerking van Cheatah:
Wat soms ook wel handig is, dat is om tijdens het ontwikkelen/testen van je rewrite rule 'm om te zetten naar een externe redirect dus [R] achter je RewriteRule plaatsen, op die manier zie je de gebruikte rule+de plaatst waar de parameters terecht komen.

Wanneer je dan klaar bent met het maken van de rule kun je 'm omzetten in een interne rewrite/redirect door [R] weg te halen of een proxy request door [R] te vervangen voor [P]...

Verwijderd

Topicstarter
@Little Penguin: tja daar heb je een goed punt, helemaal niet bij nagedacht. Ontzettend bedankt :)

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
om even in te haken op wat Cheatah zegt:

stel dat ze (om wat voor reden ook) naar een van deze adressen toe gaan:
http://www.blah.com/index/999/111/
http://www.blah.com/index/999
http://www.blah.com/index/
http://www.blah.com/index//

Dan werkt je rewrite niet. Ik weet niet wat je dan doet, want je zult waarschijnlijk in de eerste twee gevallen een 404 krijgen, en in de laatste twee toch naar index.php gestuurd worden (door apache)
Echter, een fatsoenlijke foutafhandeling is wel zo netjes.

Wat ik vaak doe is zoiets:
code:
1
2
3
RewriteEngine On
RewriteBase /rewrite-test/
RewriteRule ^index/?(.*?)$ index.php?p=$1

En vervolgens in php $p exploden op '/'

[ Voor 14% gewijzigd door BasieP op 20-07-2007 09:49 ]

This message was sent on 100% recyclable electrons.


Verwijderd

Dat zou ik niet doen. Ik zou gewoon helemaal geen eigen query string meegeven, maar alleen rewriten naar een PHP script (in jouw geval).
Dat script kan zelf wel de REQUEST_URI opvragen. En zo blijft de query string intact, want dat handelt Apache ook wel voor je af.

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 20 juli 2007 @ 11:11:
Dat zou ik niet doen. Ik zou gewoon helemaal geen eigen query string meegeven, maar alleen rewriten naar een PHP script (in jouw geval).
Dat script kan zelf wel de REQUEST_URI opvragen. En zo blijft de query string intact, want dat handelt Apache ook wel voor je af.
Maar dan gebruik je dus MultiViews en geen mod_rewrite als ik je goed begrijp.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
Verwijderd schreef op vrijdag 20 juli 2007 @ 11:11:
Dat zou ik niet doen. Ik zou gewoon helemaal geen eigen query string meegeven, maar alleen rewriten naar een PHP script (in jouw geval).
Dat script kan zelf wel de REQUEST_URI opvragen. En zo blijft de query string intact, want dat handelt Apache ook wel voor je af.
met je eens, alleen in mijn geval bewust zo gedaan.
Dit omdat ik het in een cmsje heb staan wat ook moet draaien op een server zonder mod-rewrite. Zodoende kan ik links dan gewoon aanroepen met index.php?p=blaat/hoi/ of gewoon /?p=blaat/hoi
Ik hoef dan enkel de links aan te passen ipv op veel meer plaatsen.

This message was sent on 100% recyclable electrons.

Pagina: 1