[php] mod_rewrite probleem met meerdere delen rewriten

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
Ik ben inmiddels al ruim 3 dagen bezig met dit probleem. Ik wil zoekmachine vriendelijke URL's maken. Dit werkt ook aardig totdat ik variabelen of een url die bestaat uit meerdere delen wil rewriten.

De mod_rewrite module werkt volgens phpinfo dus dit kan het probleem niet zijn. Ook htaccess wordt netjes geaccepteerd.

Ik maak gebruik van de volgende code in htaccess:
code:
1
2
3
4
5
RewriteEngine On
RewriteBase /

RewriteRule ^agenda/ /agenda.php
RewriteRule ^agenda/showagenda/ /agenda.php?item=$i

De eerste regel werkt netjes zoals het moet. Hij zet een url <domein>/agenda netjes om naar <domein>/agenda.php.

De 2e werkt dus niet meer. Deze zou <domein>/agenda/showagenda om moeten zetten naar <domein>/agenda.php?item=i$.

Mij valt op als ik bij de 1e regel de laatste / weghaal dan werkt het niet meer, dit zou dan gewoon moeten werken.

Ik heb al gezocht op de apache website en heb daar ook vanalles gevonden, echter zonder resultaat.

Tevens ben ik deze pdf tegengekomen die mij ook niet kon helpen. Het werk namelijk ook niet met de voorbeelden in deze sheets. (direct knippen/plakken).

http://www.ilovejackdaniels.com/mod_rewrite_cheat_sheet.pdf

Ik hoop dat jullie mij verder kunnen helpen.

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • reusje
  • Registratie: Maart 2004
  • Laatst online: 11-09 15:29
RewriteRule ^agenda$ agenda/ [R]
RewriteRule ^agenda/$ agenda.php

RewriteRule ^agenda/showagenda$ agenda/showagenda/ [R]
RewriteRule ^agenda/showagenda/$ agenda.php?item=$1

nu even geen tijd, straks meer uitleg :-)

Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
reusje schreef op maandag 16 oktober 2006 @ 12:57:
RewriteRule ^agenda$ agenda/ [R]
RewriteRule ^agenda/$ agenda.php

RewriteRule ^agenda/showagenda$ agenda/showagenda/ [R]
RewriteRule ^agenda/showagenda/$ agenda.php?item=$1

nu even geen tijd, straks meer uitleg :-)
Ik heb dit inmiddels uitgeprobeert, echter werkt dit ook nog niet. Ik krijg gewoon een 404 van de browser terug bij het invoeren van <domein>/agenda/showagenda

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Het is relatief eenvoudig: je sluit je regexen niet af met een $, waardoor je partial matches krijgt.

Kortom:

"^agenda/" matched alles wat begint met "agenda/", dus ook "agenda/x/y/z".

Als je enkel de letterlijke string "agenda/" wil matchen (of "agenda" for that matter), dan moet je een $ toevoegen: "^agenda/?$", waarbij de ^ en $ aangeven dat je van begin tot einde wil matchen.

Wat wil je overigens bereiken met $i? wil je daar een php variabele hebben, of wil je letterlijk de tekst "$i" in je URL. Het laatste is wat er nu zal gebeuren.

-- edit

Stel dat je alles achter "agenda/showagenda/" mee wil geven als $i, dan doe je dat anders, namelijk:

RewriteRule ^agenda/showagenda/?(.*)$ /agenda.php?item=$1

[ Voor 13% gewijzigd door B-Man op 16-10-2006 13:11 ]


Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
B-Man schreef op maandag 16 oktober 2006 @ 13:09:
Het is relatief eenvoudig: je sluit je regexen niet af met een $, waardoor je partial matches krijgt.

Kortom:

"^agenda/" matched alles wat begint met "agenda/", dus ook "agenda/x/y/z".

Als je enkel de letterlijke string "agenda/" wil matchen (of "agenda" for that matter), dan moet je een $ toevoegen: "^agenda/?$", waarbij de ^ en $ aangeven dat je van begin tot einde wil matchen.

Wat wil je overigens bereiken met $i? wil je daar een php variabele hebben, of wil je letterlijk de tekst "$i" in je URL. Het laatste is wat er nu zal gebeuren.
Het eerste deel verduidelijkt het geheel al een heel eind. Echter wil ik dat er straks een php var in komt in de vorm van:

code:
1
RewriteRule ^agenda/showagenda/(.*)$ agenda.php?index=showagenda&item=$1


Misschien dat het voor jullie nu ook weer wat duidelijker is.

--edit

Zoals het nu in het bovenstaande bericht staat, is het ook een mogelijkheid.

[ Voor 4% gewijzigd door Compusmurf op 16-10-2006 13:16 ]

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

RewriteEngine On
RewriteRule ^agenda/(.*)/ agenda.php?id=$1

Zoiets kan je proberen, dan triggert ie wel op alles, Dus ook bijv. een tekstvariabele, alles word dus naar ?id gesmeten... ;)

Je kan dit ook verfijnen, door hem alleen te laten triggeren op getal, maar kan dat momenteel even niet vinden, dacht dat dat [0-9] moet zijn, weet daar alleen de (correcte) syntax niet (meer) voor en kan het helaas momenteel ook even niet opzoeken van mijn eigen site... :)

Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
GJ-tje schreef op maandag 16 oktober 2006 @ 13:15:
RewriteEngine On
RewriteRule ^agenda/(.*)/ agenda.php?id=$1

Zoiets kan je proberen, dan triggert ie wel op alles, Dus ook bijv. een tekstvariabele, alles word dus naar ?id gesmeten... ;)

Je kan dit ook verfijnen, door hem alleen te laten triggeren op getal, maar kan dat momenteel even niet vinden, dacht dat dat [0-9] moet zijn, weet daar alleen de (correcte) syntax niet (meer) voor en kan het helaas momenteel ook even niet opzoeken van mijn eigen site... :)
Dit is inderdaar ook een goed optie, ik had het eerst maar eens zonder verfijning geprobeerd om het goed werkend te krijgen. Dit ga ik wel doen als het straks allemaal werkt zoals het moet.

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Compusmurf schreef op maandag 16 oktober 2006 @ 13:15:
[...]


Het eerste deel verduidelijkt het geheel al een heel eind. Echter wil ik dat er straks een php var in komt in de vorm van:

code:
1
RewriteRule ^agenda/showagenda/(.*)$ agenda.php?index=showagenda&item=$1


Misschien dat het voor jullie nu ook weer wat duidelijker is.
De $1 variabele in een RewriteRule heeft niets met PHP te maken, maar is een backreference naar de regex. Wat wil je precies met die php var? Krijg je die binnen in de vorm van een id achter /agenda/showagenda/1234?

Zo ja, dan ben je met bovenstaande regex klaar. Eventueel kun je nog zorgen dat je enkel een numerieke waarde doorkrijgt door de regex aan te passen:
code:
1
^agenda/showagenda/([0-9]+)(?:/.*)$

Dan krijg je in $1 enkel een getal, en matched je regex ook nog als er zaken achter de ID staan. Overigens kun je in dat geval juist van een partial match gebruik maken:
code:
1
^agenda/showagenda/([0-9]+)


ps http://www.regular-expressions.info/

[ Voor 3% gewijzigd door B-Man op 16-10-2006 13:22 ]


Acties:
  • 0 Henk 'm!

  • reusje
  • Registratie: Maart 2004
  • Laatst online: 11-09 15:29
reusje schreef op maandag 16 oktober 2006 @ 12:57:
RewriteRule ^agenda$ agenda/ [R]
RewriteRule ^agenda/$ agenda.php

RewriteRule ^agenda/showagenda$ agenda/showagenda/ [R]
RewriteRule ^agenda/showagenda/$ agenda.php?item=$1

nu even geen tijd, straks meer uitleg :-)
sorry zou dit moeten zijn, waarbij het middelste gedeelte optioneel is.

RewriteRule ^agenda$ agenda/ [R]
RewriteRule ^agenda/$ agenda.php

# Used only when no id is given
RewriteRule ^agenda/showagenda$ agenda/showagenda/ [R]
RewriteRule ^agenda/showagenda/$ agenda.php?item=<default item id>

# Used otherwise
RewriteRule ^agenda/showagenda/([0-9]*)$ agenda/showagenda/$1/ [R]
RewriteRule ^agenda/showagenda/([0-9]*)/$ agenda.php?item=$1

Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
Ik heb inmiddels het volgende er in staat.

RewriteRule ^agenda/showagenda/([0-9])$ /agenda.php?index=showagenda&item=$1

Als ik nu ga naar <domein>/agenda/showagenda/0 dan zou het moeten werken als ik het goed heb.

[ Voor 14% gewijzigd door Compusmurf op 16-10-2006 13:34 ]

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
reusje schreef op maandag 16 oktober 2006 @ 13:25:
[...]


sorry zou dit moeten zijn, waarbij het middelste gedeelte optioneel is.

RewriteRule ^agenda$ agenda/ [R]
RewriteRule ^agenda/$ agenda.php

# Used only when no id is given
RewriteRule ^agenda/showagenda$ agenda/showagenda/ [R]
RewriteRule ^agenda/showagenda/$ agenda.php?item=<default item id>

# Used otherwise
RewriteRule ^agenda/showagenda/([0-9]*)$ agenda/showagenda/$1/ [R]
RewriteRule ^agenda/showagenda/([0-9]*)/$ agenda.php?item=$1
Alleen is hier even de vraag: waar zou je met redirects werken? je verwijst immers niet naar een bestand in het bestandssysteem.
Dan zou ik (vanuit performance oogpunt), de / optional maken middels "/?".

Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Compusmurf schreef op maandag 16 oktober 2006 @ 13:34:
Ik heb inmiddels het volgende er in staat.

RewriteRule ^agenda/showagenda/([0-9])$ /agenda.php?index=showagenda&item=$1

Als ik nu ga naar <domein>/agenda/showagenda/0 dan zou het moeten werken als ik het goed heb.
Ja, inderdaad. Maar vergeet niet dat je nu maar een(1) cijfer matched. Geeft na de [0-9] een + op om minimaal 1 cijfer te matchen, en een * om minimaal 0 cijfers te matchen.

Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
B-Man schreef op maandag 16 oktober 2006 @ 13:37:
[...]

Ja, inderdaad. Maar vergeet niet dat je nu maar een(1) cijfer matched. Geeft na de [0-9] een + op om minimaal 1 cijfer te matchen, en een * om minimaal 0 cijfers te matchen.
Dus

code:
1
RewriteRule ^agenda/showagenda/([0-9])+$ /agenda.php?index=showagenda&item=$1


zou moeten werken bij het invoeren van <domein>/agenda/showagenda/0.

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Compusmurf schreef op maandag 16 oktober 2006 @ 13:41:
[...]


Dus

code:
1
RewriteRule ^agenda/showagenda/([0-9])+$ /agenda.php?index=showagenda&item=$1


zou moeten werken bij het invoeren van <domein>/agenda/showagenda/0.
Dat zal sowieso matchen, aangezien '0' maar 1 cijfer is.
Overigens moet je de quantifier direct achter de [0-9] zetten, dus ([0-9]+).

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Ik zou juist niet:
code:
1
RewriteRule ^agenda/$ agenda.php

gebruiken maar:
code:
1
RewriteRule ^agenda(.*)

Maar dat moet je dan wel achter je andere Rewrite rules voor agenda zetten, op deze manier zodra de url met agenda begint en het voldoet niet aan de andere voorwaarden, zal deze automatisch naar default agenda.php gaan.

Bovendien zou ik zoveel mogelijk zonder $ aan het einde van je rewrite werken, in plaats daarvan plaats (.*) aan het einde., Daarmee zou je dus ook een commentaar in de URL kunnen verwerken, terwijl de link dan nog steeds werkt.. ie.
code:
1
RewriteRule ^agenda/showagenda/([0-9])+(.*) /agenda.php?index=showagenda&item=$1

Dan kan je namelijk bijvoorbeeld de volgende url gebruiken:

http://localhost/agenda/showagenda/342/vandaag_is_het_vrijdag

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
Ik heb inmiddels al jullie adviezen opgevolgd maar helaas nog steeds zonder resultaat. De gewone versie met alleen agenda werkt inmiddels netjes zonder problemen, maar de versie met meerdere delen nog steeds niet.

Maar ik heb zelf nog wel een vaag vermoeden wat het probleem kan zijn. Ik kwam hierop door de post boven mij met localhost.

Het staat op een server, voor het gemak "localhost". Daarin staat een map met de naam "rewrite". De volledige URL wordt dan http://localhost/rewrite/agenda/showagenda/0. Gaat het niet fout doordat het nog in een submap staat. Htaccess staat trouwens wel gewoon in de map rewrite.

Voor de duidelijkheid, ik heb nu de volgende rule:

code:
1
RewriteRule ^agenda/showagenda/([0-9]+)$ /agenda.php?index=showagenda&item=$1

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • DemonTPx
  • Registratie: December 2002
  • Laatst online: 09-04 10:49
Dit lijkt mij typisch een gevalletje waarbij je gewoon even in je html indexpagina('s) een base tag moet meegeven:

HTML:
1
<base href="http://www.mijndomein.nl/agenda/">


..ik heb ook weken met dit probleem gezeten.. dit was voor mij de oplossing.

Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
DemonTPx schreef op dinsdag 17 oktober 2006 @ 15:07:
Dit lijkt mij typisch een gevalletje waarbij je gewoon even in je html indexpagina('s) een base tag moet meegeven:

HTML:
1
<base href="http://www.mijndomein.nl/agenda/">


..ik heb ook weken met dit probleem gezeten.. dit was voor mij de oplossing.
Ook dit biedt helaas geen oplossing.

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Compusmurf schreef op dinsdag 17 oktober 2006 @ 16:40:
[...]
Ook dit biedt helaas geen oplossing.
Zet dan eens RewriteLog aan, zodat je kunt zien wat er precies gebeurd. IIRC is het zo dat apache met RewriteRules in een .htaccess ze interpreteerd in de context van die directory, maar wat je zo te zien vergeet is dat je de URL herschrijft naar een absoluut pad (/agenda/...), en dat werkt dus niet omdat je in /rewrite/... zit.

Op te lossen door ofwel te werken met relatieve paden in je rewrite rules of RewriteBase te gebruiken.

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Maak een test.php aan, zet in die php file alleen
PHP:
1
2
3
<?php
echo "Test file!<br>";
?>

En stuur de niet werkende rewrite's naar de test pagina.

Check dan nog eens of je de agenda.php op het scherm krijgt, of de test.php pagina. (en post eens de inhoud van je .htaccess die je nu gebruikt)

[ Voor 11% gewijzigd door dusty op 18-10-2006 04:58 ]

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
B-Man schreef op dinsdag 17 oktober 2006 @ 20:12:
[...]


Zet dan eens RewriteLog aan, zodat je kunt zien wat er precies gebeurd. IIRC is het zo dat apache met RewriteRules in een .htaccess ze interpreteerd in de context van die directory, maar wat je zo te zien vergeet is dat je de URL herschrijft naar een absoluut pad (/agenda/...), en dat werkt dus niet omdat je in /rewrite/... zit.

Op te lossen door ofwel te werken met relatieve paden in je rewrite rules of RewriteBase te gebruiken.
Ik heb dit gedaan met de regel:

code:
1
Rewritelog logs/rewritelog.log


Echter staat nu in de errorlog het volgende: RewriteLog not allowed here. Het zou hier dus niet mogen maar hij staat gewoon in de log directory. Ook de rechten hierop zijn zoals het hoort, de error en access log bestanden werken wel gewoon.

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Compusmurf schreef op woensdag 18 oktober 2006 @ 09:02:
[...]


Ik heb dit gedaan met de regel:

code:
1
Rewritelog logs/rewritelog.log


Echter staat nu in de errorlog het volgende: RewriteLog not allowed here. Het zou hier dus niet mogen maar hij staat gewoon in de log directory. Ook de rechten hierop zijn zoals het hoort, de error en access log bestanden werken wel gewoon.
Als je zelf even gekeken had op de site van mod_rewrite, had je kunnen lezen dat RewriteLog enkel in de apache config (generiek of voor een virtualhost) ingesteld kan worden, en dus niet via een .htaccess in te stellen is.

Acties:
  • 0 Henk 'm!

  • Compusmurf
  • Registratie: Oktober 2003
  • Laatst online: 16-08-2024
B-Man schreef op woensdag 18 oktober 2006 @ 21:21:
[...]

Als je zelf even gekeken had op de site van mod_rewrite, had je kunnen lezen dat RewriteLog enkel in de apache config (generiek of voor een virtualhost) ingesteld kan worden, en dus niet via een .htaccess in te stellen is.
Sorry, ik ben vergeten te zeggen dat ik dit ook gedaan heb in httpd.conf. Want ik had al gekeken op de apache.org zodat ik de plaats en syntax in ieder geval goed heb.

http://Compusmurf.xs4all.nl


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Compusmurf schreef op donderdag 19 oktober 2006 @ 08:48:
[...]


Sorry, ik ben vergeten te zeggen dat ik dit ook gedaan heb in httpd.conf. Want ik had al gekeken op de apache.org zodat ik de plaats en syntax in ieder geval goed heb.
Ik was even druk met andere dingen, maar vertel: schijnbaar staat RewriteLog nog niet goed, anders krijg je die melding niet.

Heb je alle Rewrite directives nu bij elkaar gezet in je httpd.conf? Ik weet namelijk niet hoe mod_rewrite reageert op een RewriteLog zonder een RewriteEngine on, om maar een zijstraat te nemen.

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Om nou niet weer een onzinnig nieuw topic te maken dacht ik laat ik maar even hierin verder gaan :) Het topic eindigd ook nog eens met een vraag, dus echt klaar waren ze nog niet :)

Om dan maar te beginnen met een quote van B-Man die mij vandaag al een heel heldere visie gegeven heeft op het hele gebeuren en de RewriteRules.
B-Man schreef op maandag 16 oktober 2006 @ 13:09:
Het is relatief eenvoudig: je sluit je regexen niet af met een $, waardoor je partial matches krijgt.

Kortom:
"^agenda/" matched alles wat begint met "agenda/", dus ook "agenda/x/y/z".

Als je enkel de letterlijke string "agenda/" wil matchen (of "agenda" for that matter), dan moet je een $ toevoegen: "^agenda/?$", waarbij de ^ en $ aangeven dat je van begin tot einde wil matchen.

Wat wil je overigens bereiken met $i? wil je daar een php variabele hebben, of wil je letterlijk de tekst "$i" in je URL. Het laatste is wat er nu zal gebeuren.

-- edit
Stel dat je alles achter "agenda/showagenda/" mee wil geven als $i, dan doe je dat anders, namelijk:

RewriteRule ^agenda/showagenda/?(.*)$ /agenda.php?item=$1
Alhoewel ik bij de -- edit toch weer even in de war wordt gebracht. Daar staat namelijk dat vanaf de ? tot de $ doorgegeven wordt aan $1. Maar dit werkt volgens mij niet zo.

Mijn probleem dan maar :)

www.onderdegrond.nl is vanavond de testopstelling.
Daar heb ik even alle hele nuttige dingen aan de kant geschoven dus kan nu even online testen.
In de root heb ik 3 bestandjes:
.htaccess
index.php
stylesheet.css

de .htaccess
code:
1
2
RewriteEngine On
RewriteRule ^(.*)$ index.php?menu=$1


stylesheet is gewoon body background color zwart en text rood. Moest ff wat verzinnen.

Index.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
$args = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$menu = parse_url($_GET['menu']); 
$menu = rtrim($menu['path'], '/'); 
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="http://www.onderdegrond.nl/" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Test</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
</head>
<body>
<div id="bla"><? echo"$args[0],$args[1],$args[2],$args[3],$args[4]<br /><br />"; echo"$menu"; ?></div>
<div id="bla">test</div>
</body>
</html>


De reden voor het weergeven van de $args en $menu is om het op 2 manieren te testen. De menu zal met deze .htaccess niets weergeven omdat achter de index.php geen verwijzing staat naar $1. Maar als ik dit wel instel dan gebeurt er ook niets.

Probleem is als volgt: Ik ga het proberen zo goed mogelijk uit te leggen :) Maar ik wil als volgt te werk gaan. Ik heb een hoofdmenu. Daarin heb ik bijvoorbeeld nieuws. Als je met de muis over Nieuws gaat komt er een submenu tevoorschijn en daar kan je kiezen voor wat items. Mocht je dus klikken op nieuws dan moet er www.onderdegrond.nl/nieuws of www.onderdegrond.nl/nieuws/ komen. Ondersteuning voor beide is het mooiste.

Als er dus op geklikt wordt krijg je dus bij wijze van een pagina met de items van nieuws. Als je daar dan op klikt moet de url www.onderdegrond.nl/nieuws/1500 of dus weer www.onderdegrond.nl/nieuws/1500/ . Ik zet maar even een getal neer, maar dat kan dus ook tekst zijn bijvoorbeeld. Gaat er even om dat het moet werken.

Wat gebeurt er: Als je gaat kijken op www.onderdegrond.nl zie je bovenin een aantal komma's staan, 2 breaks verder staat er test. Er is geen opmaak.
Vul je nu achter www.onderdegrond.nl/ iets in, bijvoorbeeld bla ( www.onderdegrond.nl/bla ) dan toont de site "bla,,,," en de rest. Zet je daar achter weer /bla dan wordt het "bla,bla,,," etc.

Het "werkt" dus enigszins, want hij kan het namelijk wel uitlezen. Maar ik ben mijn opmaak kwijt. Als ik de htaccess rename dan heb ik wel opmaak, maar dan dus niet meer de mogelijkheid die ik wil :)

Duidelijk lijkt me.
Voor de fanatici, ik ben al 2 dagen bezig, heb verschillende manieren geprobeerd, wel 5x overnieuw begonnen. Ik heb een werkende versie die overweg kan met het 1e niveau, maar zodra je dieper zou willen dan gaat het ook mis.

Ik ben nu dus nogmaals overnieuw begonnen op een directe root van een website om op die manier zoveel mogelijk overeenkomst te kunnen krijgen met tutorials en voorbeelde. Vanuit localhost werkt het weer anders met paden etc.

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Goed dat ik zelf met de "oplossing" aan kom zetten.

.htaccess ziet er nu zo uit: zo hoort het dus niet!!
code:
1
2
3
4
5
6
RewriteEngine On

RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$       /index.php?menu=$1&submenu=$2
#RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$       /index.php?menu=$1&submenu=$2
RewriteRule ^([a-zA-Z0-9_-]+)/$                        /index.php?menu=$1
#RewriteRule ^([a-zA-Z0-9_-]+)$                        /index.php?menu=$1


Nu heb ik alleen een volgende "probleem": Als je surft naar www.onderdegrond.nl/handdoek/gelukt/ dan zie je dat het werkt, met opmaak ( stunning really ). Maar het zou mooi zijn als het ook werkt zonder de laatste "/" dus met www.onderdegrond.nl/contact ipv contact/

De 2 regels voorzien van een "#" aan het begin had ik aangemaakt voor test, maar dat werkt nog niet. Even verder zoeken en knutselen want als dat werkend is dan zou dat echt fantastisch zijn!

[ Voor 69% gewijzigd door orange.x op 21-11-2007 20:35 . Reden: Oplossing gefunden! ]


Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Wat bedoel je precies met "ik ben mijn opmaak kwijt"? Bedoel je dat je CSS en plaatjes niet meer geladen worden? Dat is namelijk het enige waar ik bij die opmerking aan moet denken.

Als dat inderdaad het geval is, moet je even letten op het volgende: als je plaatjes, css en links in je pagina hebt staan die relatief zijn, zul je die absoluut moeten maken, of relatief ten opzichte van de huidige URL. Stel je wil een plaatje laden vanaf de URI test/plaatje1.jpg.
Als je de site zonder RewriteRules draait, wordt dit plaatjes netjes geladen vanaf http://www.onderdegrond.nl/test/plaatje1.jpg; Ga je werken met RewriteRules en dus heel andere URLs, dan probeert je browser het plaatje te laden vanaf (bijvoorbeeld) http://www.onderdegrond.nl/nieuws/1500/test/plaatje1.jpg;

Er gaat vervolgens iets mis: je RewriteRule pakt deze URL ook op, dus PHP krijgt de aanvraag ipv je webserver.
Op te lossen? Uiteraard! Zet statische content in (bijvoorbeeld) een mapje "media" direct in je webroot, en sluit deze map uit in je RewriteRule:
code:
1
RewriteRule    !^media/.*    index.php

Op deze manier handelt je webserver alle aanvragen voor /media/* zelf af.

Als je vervolgens je statische content (plaatjes/css/...) aanroept via "/media/plaatje1.jpg", werkt het prima.

-- edit:

Waarom probeer je overigens nog data aan je script door te spelen via de menu variabele? De data die je wil hebben kun je verkrijgen via $_SERVER['REQUEST_URI'] (zoals je dat al doet).

Verder raad ik je aan te kijken op regular expressions.info. Wat je bijvoorbeeld probeert te doen met de "/" op het eind is namelijk eenvoudig: je wilt een optionele match, die af te dwingen is met een vraagteken:
code:
1
^test/?
matched bijvoorbeeld "test" en "test/", omdat ik met het vraagteken aangeef dat de slash op het eind optioneel is (hij mag 0 of 1 keer voorkomen). Zo heb je ook nog andere "quantifiers" (de * en +), maar daarover lees je meer op de site waar ik je net naar verwees.

[ Voor 22% gewijzigd door B-Man op 21-11-2007 20:37 ]


Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
@ B-Man, ik was inderdaad mijn opmaak kwijt door de verkeerde formulering in de .htaccess....

Nu heb ik gelijk ook zelf even de oplossing gevonden voor het probleempje met de "/" aan het einde.
Op de volgende manier kan het beide, dit geldt dus voor maximaal 2 "variabelen" achter het domein.
www.domein.nl/test1/test2 zal dus werken, evenals www.domein.nl/test1/test2/
Wat niet werkt is dus www.domein.nl/test1/test2/test3

Dan zullen er meerdere regels aangemaakt moeten worden.

code:
1
2
3
4
5
6
RewriteEngine On

RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)$ /index.php?menu=$1&submenu=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$    /index.php?menu=$1&submenu=$2
RewriteRule ^([a-zA-Z0-9_-]+)$          /index.php?menu=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$         /index.php?menu=$1

Was dus een kwestie van degene zonder / boven degene met / zetten. Om nu een item toe te voegen moet ook niet zo moeilijk meer zijn. Deze moet boven de andere regels komen omdat de langste bovenaan moet.

Bedankt he jongens :D Waar zou ik zijn zonder tweakers.net :+

Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
orange.x schreef op woensdag 21 november 2007 @ 20:35:
... Dan zullen er meerdere regels aangemaakt moeten worden. ...
Dat is dus niet nodig indien je gewoon alles matched, en in je PHP script $_SERVER['REQUEST_URI'] uitleest :)

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
B-Man schreef op woensdag 21 november 2007 @ 20:39:
[...]


Dat is dus niet nodig indien je gewoon alles matched, en in je PHP script $_SERVER['REQUEST_URI'] uitleest :)
True, maar als je nou wilt voorkomen dat je fouten maakt ofzo :)

Waar ik me voornamelijk aan heb gestoord op internet is de manier van uitleggen en als je dus alles volgt je iets niet werkends krijgt :) Daarom dacht ik als ik nou gewoon er voor zorg dat dit te snappen is dan is het goed.

Jouw text heeft me namelijk al meer inzicht gegeven gewoon vanwege de vertaling zeg maar :) Maar er zijn meerdere manieren mogelijk, alleen moet de basis wel goed zijn, want anders werkt het dus gewoon niet :)

Acties:
  • 0 Henk 'm!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
orange.x schreef op woensdag 21 november 2007 @ 21:49:
[...]

True, maar als je nou wilt voorkomen dat je fouten maakt ofzo :)

Waar ik me voornamelijk aan heb gestoord op internet is de manier van uitleggen en als je dus alles volgt je iets niet werkends krijgt :) Daarom dacht ik als ik nou gewoon er voor zorg dat dit te snappen is dan is het goed.

Jouw text heeft me namelijk al meer inzicht gegeven gewoon vanwege de vertaling zeg maar :) Maar er zijn meerdere manieren mogelijk, alleen moet de basis wel goed zijn, want anders werkt het dus gewoon niet :)
Door REQUEST_URI in je PHP script te parsen heb je gewoon veel meer vrijheid. Wat je nu doet met rewriterules via apache kun je ook exact hetzelfde doen middels regular expression (preg_match) in je PHP script.

Begrijpen wat er gebeurt doet natuurlijk ook wonderen, daarom ging ik even verder in op je vraag.

Succes verder!

Acties:
  • 0 Henk 'm!

  • orange.x
  • Registratie: Maart 2002
  • Laatst online: 18-07 10:57
Thanks :) Zal daar ook eens een oogje op laten vallen binnenkort, er zitten namelijk wel wat haken en ogen aan. Zo wil ik nu namelijk meerdere tekens toevoegen die mogen in de string. Bijvoorbeeld de +. Maargoed, als dat niet mogelijk is, dan niet :) Verzinnen we wel wat op.
Pagina: 1