Mod_rewrite werkt maar voor de helft

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jeroen germers

jeroen germers

11/07/2015 13:58:19
Quote Anchor link
Hallo Allemaal,

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

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
 
PHP hulp

PHP hulp

28/11/2024 06:43:31
 
Ward van der Put
Moderator

Ward van der Put

11/07/2015 14:19:20
Quote Anchor link
De match in deze rewrite rules is identiek:

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.
 
Jeroen germers

jeroen germers

11/07/2015 14:25:30
Quote Anchor link
ja dat had ik al verwacht dat het daaraan zal liggen, maar der wordt toch echt 2 verschillende dingen geladen?
Het zal vast en zeker wel iets simpels zijn, maar zou je mij een voorbeeldje kunnen geven hoe ik dat het beste kan controleren?
 
Ward van der Put
Moderator

Ward van der Put

11/07/2015 14:45:13
Quote Anchor link
Apache ziet slechts de URL /foo/bar.html maar kan alleen daaruit niet zelfstandig afleiden of daarmee &product=bar of &cat=bar wordt bedoeld. Je hebt dus een ander mechanisme nodig dat een onderscheid kan maken tussen een product en een categorie.

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

11/07/2015 14:49:40
Quote Anchor link
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.

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
 
Jeroen germers

jeroen germers

11/07/2015 15:19:57
Quote Anchor link
Ok het is dus inderdaad het probleem met dezelfde rewrite rules.
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



//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
 
Thomas van den Heuvel

Thomas van den Heuvel

12/07/2015 12:14:06
Quote Anchor link
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.
 
Marthijn Buijs

Marthijn Buijs

12/07/2015 13:41:47
Quote Anchor link
Ik zou zeggen: kijk eens naar het PHP framework Slim 2.. Alles gaat via 1 bestand en je kan heel makkelijk routes maken en de bijhorende content tonen. Uiteraard met SEO-vriendelijke URLs.
Gewijzigd op 12/07/2015 13:44:04 door Marthijn Buijs
 
Jeroen germers

jeroen germers

12/07/2015 17:13:41
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.