[htaccess] werkt op de ene server wel, de andere niet.

Pagina: 1
Acties:

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 07:32
Hallo Tweakers,

Ik ben al een tijdje bezig met een sitetje,
Allemaal nette url's dmv htaccess.
Dit werkte allemaal op de test server.
Configuratie:
Plesk 8.1.0
CentOS
Apache

Werkte helemaal perfect. Nu hebben we alles verhuis naar de nieuwe server.
Configuratie:
Linux
DirectAdmin
Apache

Alleen nu werkt de htaccess deels.

Allereerst de htaccess dan maar:
http://your-profile.nl/htaccess.txt ( te lang om te posten )

Bijna alle pagina's doen het, behalve de volgende delen niet:

code:
1
2
RewriteRule ^profiel/wijzigen/?$ wijzigprofiel.php
RewriteRule ^profiel/gegevens/?$ gegevens.php

en
code:
1
2
3
4
5
6
7
8
9
10
RewriteRule ^fotoalbum/beheer/verwijder/([^.\/]+)/?$ fotoalbumbeheer.php?action=delete&album_ID=$1
RewriteRule ^fotoalbum/beheer/?$ fotoalbumbeheer.php
RewriteRule ^fotoalbum/upload/([^.\/]+)/up/([^.\/]+)/?$ fotoupload.php?album_ID=$1&action=up&foto_ID=$2
RewriteRule ^fotoalbum/upload/([^.\/]+)/down/([^.\/]+)/?$ fotoupload.php?album_ID=$1&action=down&foto_ID=$2
RewriteRule ^fotoalbum/upload/([^.\/]+)/delete/([^.\/]+)/?$ fotoupload.php?album_ID=$1&action=delete&foto_ID=$2
RewriteRule ^fotoalbum/upload/([^.\/]+)/?$ fotoupload.php?album_ID=$1
RewriteRule ^fotoalbum/user/([^.\/]+)/album/([^.\/]+)/?$ fotoalbum.php?user_ID=$1&album_ID=$2
RewriteRule ^fotoalbum/user/([^.\/]+)/?$ fotoalbum.php?user_ID=$1
RewriteRule ^fotoalbum/foto/([^.\/]+)/?$ fotoalbum_view.php?foto_ID=$1
RewriteRule ^fotoalbum/wijzigfoto/([^.\/]+)/?$ fotoalbum_wijzig.php?foto_ID=$1


of hij pakt de verkeerde pagina. of hij ziet hem als een /username/ (profiel dus).
Erg raar allemaal.
Ook doen de $_GET parameters niet op de pagina's die hij verkeert pakt.

ik kan niks nuttigs vinden op google of de got search.
In de apache log valt ook niet bijzonders te vinden.

misschien zien jullie wat ik fout doe?

Verwijderd

staat er op de server waar het fout gaat mod_rewrite aan?

  • Scotix
  • Registratie: Juni 2002
  • Laatst online: 07:32
Verwijderd schreef op dinsdag 02 januari 2007 @ 22:00:
staat er op de server waar het fout gaat mod_rewrite aan?
ja, want de meeste pagina's doen het gewoon.

ik kan bijvoorbeeld bij het forum een topic opvragen en die doet het gewoon.
Haal gewoon een parameter op met $_GET

  • stevenP
  • Registratie: December 2003
  • Laatst online: 18:13
Begin eens in je code met een error reporter, dit kan met behulp van RewriteLog commando, zie de cheatsheet van I Love Jack Daniels. Hier staan alle commando's en wat tips over alg. ritmes etc..

Gasloos! 3100Wp Z, 2150Wp W, Panasonic 5J monoblock, Panasonic 150L WPB


Verwijderd

Hai, heb me geprobeerd een beetje te verdiepen in het probleem. Aangezien de site op de eerste server wel goed werkt kunnen we denk dat we kunnen aannemen dat de problemen ontstaan zijn door een andere configuratie op de nieuwe server. Dat kunnen een aantal dingen zijn.

De module mod_rewrite maakt gebruik van een regular-expression parser. Het kan zijn dat deze parser OS of distributie afhankelijk is. In dit geval worden de rewrite rules gewoon anders geïnterpreteerd. Ik denk niet dat hier een makkelijke oplossing voor is, maar het lijkt me ook niet heel waarschijnlijk dat dit het probleem veroorzaakt.

Het is waarschijnlijker dat de Apache of mod_rewrite configuratie anders is op de nieuwe server.

Wat me opvalt aan de htaccess.txt is de laatste RewriteRule,

code:
1
RewriteRule ^([^.\/]+)/?$ profiel.php?user=$1


Alle RewriteRules in htacces.txt worden door mod_rewrite gebruikt om de url te herschrijven. Dit gebeurt in dezelfde volgorde als in htaccess.txt staat. Een van de problemen was dat soms de url werd gezien als profiel pagina. Ik denk dat dit hierdoor komt. Deze regel match namelijk alles wat tenminste 1 teken lang is en geen punten of forward slashes bevat. (Moet die punt trouwens niet ook ge-escaped worden? op deze manier matched die punt namelijk alle tekens. ) De url's worden denk ik alsvolgt herschreven,

code:
1
2
3
4
5
fotoalbum/beheer/verwijder/101
=> fotoalbumbeheer.php?action=delete&album_ID=10
en
fotoalbumbeheer.php?action=delete&album_ID=10
=> profiel.php?user=fotoalbumbeheer.php?action=delete&album_ID=10


Dit verklaart gelijk waarom het lijkt dat de $_GET variabele niet werkt, want op deze manier krijgt $_GET['album_ID'] geen waarde toegekend. Probeer anders een var_dump ($_GET) of var_dump ($_REQUEST). De super global $_REQUEST is een verzameling van $_GET, $_POST en $_COOKIE.

In de mod_rewrite documentatie staat dat het gedrag van een RewriteRule beïnvloed kan worden met "flags". De [L] flag betekent dat na deze regel geen andere regels meer uitgevoerd worden. Hiermee kan je dus voorkomen dat urls meerdere malen herschreven worden. Misschien stond deze optie op de eerste server standaard al aan, zodat de site toen hiermee geen problemen had.

De RewriteOptions MaxRedirects=1 statement kan niet gebruikt worden, want hierdoor geeft Apache een "500 Internal Server Error".

Wat verder wel bruikbaar is, is het RewriteLog statement. Hiermee kan je namelijk precies zien welke url hoevaak op welke manier wordt herschreven.

Een andere oplossing is de RewriteRules in htaccess.txt op zo'n manier te sortereren of te schrijven, dat ze allemaal geparsed kunnen worden zonder problemen. Een betere RewriteRule voor de profiel pagina zou bijvoorbeeld zijn:

code:
1
RewriteRule ^([0-9a-zA-Z-_]+)/?$ profiel.php?user=$1 [L]


Met deze regel leg je de username gelijk een restrictie op i.p.v. dat alle tekens behalve een forward slash mogen voorkomen. Met deze restrictie worden ook andere tekens uitgesloten, die problemen kunnen veroorzaken. Zoals het vraagteken, dollarteken, ampersand- of is-teken.

Het eerste wat je kunt proberen is tijdelijk even de laatste RewriteRule verwijderen en kijken of dat het probleem veroorzaakte. Daarnaast is het wel verstandig om een log te gebruiken, zodat je precies kunt zien wat er allemaal gebeurt. Vervolgens kun je kijken welke RewriteRules allemaal een [L] flag nodig hebben.

Veel succes! Hopelijk vind je de oplossing.