Mod_rewrite werkt maar voor de helft
Ik ben druk bezig om me eindelijk is te verdiepen in mod rewrite.
Nou weet ik er vrij weinig vanaf, maar heb ik het wel voor elkaar gekregen om het grotendeels aan de praat te krijgen.
oke wat gebruik ik:
Quote:
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&product=$2
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&cat=$2
RewriteRule ^([^/]*)\.html$ /index.php?pagina=$1
RewriteRule ^([^/]*)/([^/]*)/pagina_([^/]*)\.html$ /index.php?pagina=$1&cat=$2&subnav=$3
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&naam=$2
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&product=$2
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&cat=$2
RewriteRule ^([^/]*)\.html$ /index.php?pagina=$1
RewriteRule ^([^/]*)/([^/]*)/pagina_([^/]*)\.html$ /index.php?pagina=$1&cat=$2&subnav=$3
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&naam=$2
zoals je ziet zet ik alles om naar directories en naar.html pagna's.
Mijn probleem is dat de helft word omgezet en de andere helft de pgina wel laad, maar niet de formulieren etc laat zien.
Quote:
RewriteRule ^([^/]*)/([^/]*)/pagina_([^/]*)\.html$ /index.php?pagina=$1&cat=$2&subnav=$3
werkt prima, als ik deze alleen gebruik, gebruik ik:
Quote:
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&cat=$2
dan geeft de eerste een foutmelding dat $cat niet bekend is.
het is heel vreemd allemaal, hoe krijg ik dit werkend?
wil gewoonweg dat alles werkt en niet de helft.
Hopelijk is dit een beetje duidelijk
Gewijzigd op 11/07/2015 15:51:59 door Jeroen germers
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&product=$2
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&cat=$2
Daarom wordt de eerste rewrite rule gepakt en zie je nooit een cat= in de URL verschijnen.
Je kunt dit bijvoorbeeld oplossen door in index.php iets in te bouwen dat begrijpt of de waarde $2 de ID van een product of van een categorie is.
Het zal vast en zeker wel iets simpels zijn, maar zou je mij een voorbeeldje kunnen geven hoe ik dat het beste kan controleren?
Daar moet je een ontwerpbeslissing nemen: wáárin verschilt een product van een categorie? Waaraan kun je beide herkennen?
Wat ik zelf bijvoorbeeld wel eens doen, is de extensie alleen gebruiken voor een product. Dan krijg je zoiets:
• /foo/bar/ is een categorie;
• /foo/bar.html is een product.
Een nadeel van het definiëren van vele RewriteRules is dat de volgorde van de rules steeds belangrijker wordt naarmate deze (.htaccess - althans, ik neem aan dat je dat hier regelt) lijst groeit.
Daarnaast stop je hiermee routing-logica in een apart bestand wat je elke keer aan moet passen als hier iets in verandert. Dat is nogal onhandig in het beheer.
Het lijkt mij een veel beter idee om deze routinglogica te verplaatsen naar je PHP-code. Die kun je dan daar (mogelijk via een interface) aansturen, in plaats van dat je loopt te prutten in een .htaccess bestand die mogelijk je hele site onderuit haalt als hier een fout in zit.
De crux daarbij is dat je alles doorstuurt naar één bestand, bijvoorbeeld index.php (EDIT: waar vervolgens bepaald wordt welke pagina uiteindelijk geladen moet worden). In dit topic staan pointers voor deze aanpak. Het opzetten kost enige moeite, maar daar kun je daarna de vruchten van plukken. Je hoeft dan in ieder geval nooit meer in je .htaccess bestand te zijn om dingen te wijzigen en is de weg open om dit uiteindelijk te automatiseren en op den duur in beheerschermen te regelen.
Het hangt natuurlijk af van een aantal zaken of deze aanpak de moeite loont. Zoals:
- gaat je site nog verder groeien
- hoe lang bestaat je site nog
- is er tijd/geld om deze wijziging door te voeren
etc.
Gewijzigd op 11/07/2015 14:51:31 door Thomas van den Heuvel
Nu heb ik geen zin om php de rewrite te laten doen, wat is het nut van een .htaccess die ervoor bedoeld is als je alsnog php alles laat redirecten.
Dus ik ga het heel simpel oplossen, doormiddel van de linkjes te veranderen op de pagina's en voeg het tevens toe aan de rewrite rules, heb dit even getest en werkt prima, geen extra script voor nodig.
Harstikke bedankt voor de uitleg.
mijn werkende .htaccess
Quote:
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)/pagina_([^/]*)\.html$ /index.php?pagina=$1&cat=$2&subnav=$3
RewriteRule ^([^/]*)/product/([^/]*)\.html$ /index.php?pagina=$1&product=$2
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&cat=$2
RewriteRule ^([^/]*)/tekst/([^/]*)\.html$ /index.php?pagina=$1&naam=$2
RewriteRule ^([^/]*)\.html$ /index.php?pagina=$1
RewriteRule ^([^/]*)/([^/]*)/pagina_([^/]*)\.html$ /index.php?pagina=$1&cat=$2&subnav=$3
RewriteRule ^([^/]*)/product/([^/]*)\.html$ /index.php?pagina=$1&product=$2
RewriteRule ^([^/]*)/([^/]*)\.html$ /index.php?pagina=$1&cat=$2
RewriteRule ^([^/]*)/tekst/([^/]*)\.html$ /index.php?pagina=$1&naam=$2
RewriteRule ^([^/]*)\.html$ /index.php?pagina=$1
//edit
Quote:
Het kan misschien ook helpen dat je een [L] achter elke rule zet. Deze flag geeft aan dat als er een match wordt gevonden, deze op moet houden met het herschrijven.
Dit had ik al op verschillende manieren geprobeerd, en werkt niet.
Gewijzigd op 11/07/2015 15:44:46 door jeroen germers
Jeroen germers op 11/07/2015 15:19:57:
wat is het nut van een .htaccess die ervoor bedoeld is als je alsnog php alles laat redirecten.
Het instrueert je webserver hoe je op een globale wijze omgaat met requests. Daarna heb je in PHP de flexibiliteit om hier alsnog een eigen invulling aan te geven.
Dit kan heel simpel als je dit wilt en er hoeft dan trouwens helemaal geen redirect aan te pas te komen - PHP besluit welke code er geladen en uitgevoerd dient te worden, dit is iets compleet anders dan een redirect naar een andere locatie.
Deze werkwijze is helemaal niet vreemd en wordt vrij breed toegepast ook al lijkt de meerwaarde in eerste oogopslag minimaal.
Het op voorhand afschrijven van een oplossingsrichting simpelweg omdat je iets niet begrijpt of er niet direct het nut van inziet (meestal omdat je het niet begrijpt) getuigt van een weinig onderzoekende houding.
Gewijzigd op 12/07/2015 13:44:04 door Marthijn Buijs
Quote:
Het op voorhand afschrijven van een oplossingsrichting simpelweg omdat je iets niet begrijpt of er niet direct het nut van inziet (meestal omdat je het niet begrijpt) getuigt van een weinig onderzoekende houding.
Ik schrijf het niet af, het lijkt mij ook erg handig om in de toekomst te gebruiken.
Op dit moment ben ik bezig met mod rewrite, dat php veel kan dat weet ik, maar ik wou een simpele oplossing icm met mod rewrite.
Aangezien ik toch de linkjes moest aanpassen ivm mod rewrite was het voor mij dus veel makkelijker om gewoon een toevoeging erbij te plaatsen.
"weinig onderzoekende houding"
Nee absoluut niet, ik heb het bekeken, en heb er verder op na gezocht.
In dit geval is die oplossing omslachtiger dan een toevoeging plaatsen.
Het gaat hier immers om een kleine site met een paar linkjes.