Dynamische urls omzetten naar statische via htaccess mod_rewrite

Status
Niet open voor verdere reacties.

peps03

Gebruiker
Lid geworden
20 nov 2009
Berichten
93
Hoi,

Ik probeer nu al dagen m'n dynamische urls om te zetten naar statische.

Ik ben er (hopelijk) achter gekomen dat ik wat het probleem is, maar heb het nog niet weten op te lossen.

Omdat ik meer domeinen host op 1 hosting account heb ik ten eerste een .htaccess bestand inde root gezet die de verschillende domeinen verwijst naar de verschillende mappen in de root.

die betreffende regels in de root .htaccess:

RewriteCond %{HTTP_HOST} ^example.com$
RewriteCond %{REQUEST_URI} !^/example.com/
RewriteRule (.*) /example.com/$1

rewritecond %{http_host} ^www.example.com [nc]
rewriterule ^(.*)$ http://example.com/$1 [r=301,nc]

vervolgens heb ik in /example.com/test/ een .htaccess bestand staan om de rewrite uit te voeren (via http://www.generateit.net/mod-rewrite/ gegenereerd):

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^product/([^/]*)/$ /test/?product=$1 [L]

Dit is de url die herschreven moet worden:
http://example.com/test/?product=tv-met-afstandsbediening
naar:
http://example.com/test/product/tv-met-afstandsbediening/

Probleem is volgens mij dat ik 2 .htaccess bestand gebruik. Hopelijk kan het zo blijven, ik vind het namelijk erg overzichtelijk als de verdeling van de domeinnamen naar de mappen in de root daar wordt gedaan door het .htaccess bestand en de rest van de regels in de map van het domein zelf wordt geregeld.

Hoe kan ik dit voor elkaar krijgen? Heb al zoveel op internet gezocht dat ik hoop dat jullie me hier kunnen redden!

Bedankt!
 
Loop nu vast op het volgende, het rewriten van de url is inmiddels gedeeltelijk gelukt..

Waar het nog mis gaat is wanneer een formulier wordt verzonden en de waardes met een $_get moeten worden opgehaald, en wanneer er van taal (nl / eng) moet worden geswitched.

De url ziet er nu zo uit (= goed):

http://www.example.com/product/tv-met-afstandsbediening/

Rerwite regel: RewriteRule ^([^/]+)/([^/]+)/$ /?$1=$2 [L] (staat in htaccess bestand in zelfde folder, de "test" map die in de eerste post staat, is er tussen uit)

Het gaat mis wanneer de url er zo uitziet : http://www.example.com/product/tv-met-afstandsbediening/?lang=eng of http://www.example.com/product/tv-met-afstandsbediening/?keuze=500

Hoe kan ik dit oplossen?
 
in principe zou je zo'n URL dus nooit moeten krijgen. De /?keuze=500 zondigt eigenlijk tegen de notatie die je probeert te voorkomen. Er zijn een aantal mogelijkheden.

als je ze samen wil voegen kun je zoiets doen:

RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/([^/]+)/$ /?$1=$2&%1 [L]
RewriteRule ^([^/]+)/([^/]+)/$ /?$1=$2 [L]
 
Erg veel dank voor de reactie wampier!
Het werkt zo perfect!!

Toch nog twee vragen als je het niet erg vindt.

1. Wat doet de code precies? (de laatste regel snap ik...)

2. Hoe zou ik dit kunnen voorkomen? met /?lang=nl een rewrite rule maken als deze?:
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /?$1=$2&$3=$4 [L]
met $3 = lang en $4= nl

dit had ik geprobeerd geloof ik, maar dat gaf weer problemen als "lang" leeg was.

Super bedankt!!
 
1) Een rewritecondition voegt, zoals de naam al doet vermoeden, een conditie toe voordat de regel wordt toegepast. De conditie is hier dat de querystring ( bijvoorbeeld ?lang=nl) minstens 1 of meer tekens bevat. Bovendien wordt het resultaat vervolgens opgeslagen.

Als aan de conditie wordt voldaan wordt de eropvolgende rule toegepast (er kunnen overigens meerdere conditions zijn). De rule is exact hetzelfde als wanneer er geen querysting wordt meegegeven, behalve &%1 . de ampersand is letterlijke tekst, de %1 is de opgeslagen informatie van de condition, net zoals $1 en $2 dat doen voor de rule zelf.

2) je kunt dus met conditions eerst nagaan welke regel moet gelden. Overigens is de aanpak die je hebt niet slecht, echter met rewrites kun je de query uit de URL houden. Je kunt de parameter wel meegeven, maar de gebruiker hoeft hem dus niet te zien. net zoals de gebruiker niet ziet dat /apparaat/type eigenlijk ?apparaat=type is. Wat betreft search engines en friendly URL's is je aanpak zeker voldoende.
 
Laatst bewerkt:
Het is me bijna helemaal gelukt. wat vind je ervan? ziet het er acceptabel uit? kan het beter?

#wel lang nl en evt keuze
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /?$1=$2&lang=$3&%1 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /?$1=$2&lang=$3 [L]

#geen lang wel evt keuze
RewriteCond REQUEST_URI !^/nl/$
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/([^/]+)/$ /?$1=$2&%1 [L]
RewriteCond REQUEST_URI !^/nl/$
RewriteRule ^([^/]+)/([^/]+)/$ /?$1=$2 [L]

Alleen dit is nog niet gelukt...
#geen product wel lang en evt keuze
RewriteCond REQUEST_URI ^/nl/$
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/$ /?lang=$1&%1 [L]
RewriteCond REQUEST_URI ^/nl/$
RewriteRule ^([^/]+)/$ /?lang=$1 [L]

Dank!
 
Je maakt het jezelf, denk ik, moeilijk door je gebruikte search patterns. Bovendien gebruik je nog steeds de querystring conditie, die zou niet meer voor moeten komen? Overigens kun je het ook laten zoals het was :P . Dus welke URLS probeer je te bewerkstelligen?

deze?:

site/group/type/
site/group/type/nl/
site/group/type/keuze/
site/group/type/keuze/nl/
site/group/type/nl/keuze/

Het patroon dat je zoekt is: minstens 2 vakken met keuzes, gevolgd door door 1 of 2 statements.

bij het patroon "/nl/$" MOET /nl/ achteraan staan. Echter de situatie die je zoek bij bovenstaande is:

/.../.../nl/
/.../.../nl/.../
/.../.../.../nl/

Je kunt dus zoeken naar /nl/ nadat er minstens 2 vakken zijn geweest. Mocht je meerdere talen hebben kun je bijvoorbeeld zoeken naar een statement van precies 2 letters. Laat even weten wat je precies voor ogen hebt en ik zal proberen je wat verder te helpen.
 
Dank je voor de reply.

Zal het hieronder even duidelijk de stand van zaken voor je uiteenzetten.
Dit werkt goed:

# wel product & wel lang nl & evt keuze
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /?$1=$2&lang=$3&%1 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /?$1=$2&lang=$3 [L]

http://www.example.com/product/tv-met-afstandsbediening/nl/?keuze=500
http://www.example.com/product/tv-met-afstandsbediening/nl/


#wel of geen product & geen lang & wel evt keuze
RewriteCond REQUEST_URI !^/nl/$
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/([^/]+)/$ /?$1=$2&%1 [L]

RewriteCond REQUEST_URI !^/nl/$
RewriteRule ^([^/]+)/([^/]+)/$ /?$1=$2 [L]

http://www.example.com/product/tv-met-afstandsbediening/?keuze=500
http://www.example.com/product/tv-met-afstandsbediening/

http://www.example.com/
http://www.example.com/?keuze=500


Alleen dit werkt nog niet (de home pagina in nl): // hier gaat het om
http://www.example.com/nl/?keuze=500
http://www.example.com/nl/

Heb het met deze code geprobeerd te bewerkstelligen, zonder succes:

#geen product, wel lang en keuze
RewriteCond REQUEST_URI !^/product/$
RewriteCond REQUEST_URI ^/nl/$
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/$ /?lang=$1&%1 [L]

#geen product, wel lang geen keuze
RewriteCond REQUEST_URI !^/product/$
RewriteCond REQUEST_URI ^/nl/$
RewriteRule ^([^/]+)/$ /?lang=$1 [L]

Waar gaat het mis?
bedankt!
 
Zoals ik boven al aangaf zou je dit algemeen op kunnen lossen. In de huidige methode moet je nog eens goed kijken naar je matches:

bijvoorbeeld ^/nl/$ betekend automatisch dat de uri geen product kan bevatten.

staat de code wel in de juiste .HTACCESS ? als de code in je /product staat gaat het natuurlijk ook niet werken :P
 
>> bijvoorbeeld ^/nl/$ betekend automatisch dat de uri geen product kan bevatten.

hoezo? bevat de uri dan niet in ieder geval /nl/ en evt /product/ ?

http://www.example.com/nl/ verschijnt trouwens wel in de url-balk, alleen krijg ik een 404-error
 
hmm. toch bedankt!

de 2 dik gedrukte regels weghalen heeft het probleem opgelost!

#geen product wel evt lang en evt keuze
#RewriteCond REQUEST_URI ^/nl/$
RewriteCond REQUEST_URI !^/product/$
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^([^/]+)/$ /?lang=$1&%1 [L]

#RewriteCond REQUEST_URI ^/nl/$
RewriteCond REQUEST_URI !^/product/$
RewriteRule ^([^/]+)/$ /?lang=$1 [L]

heel veel dank voor de tijd en uitleg!!
 
Dat komt omdat dat betekend:

^ <- begin van de uri
/nl/ <- dit moet er exact staan
$ <- einde van de uri

er kan dus automatisch niets anders staan dan exact /nl/
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan