[PHP] Mod Rewrite met meerdere variabelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NeilForeal
  • Registratie: Oktober 2006
  • Laatst online: 16-12-2024
Hoi Tweakers,

Ik ben momenteel bezig met een Mod Rewrite om de ULRs van een website aantrekkelijker te maken. Ik loop echter tegen een probleem op waar ik nog geen oplossing voor heb gevonden in de verscheidene tutorials die ik heb gelezen.

Standaard moet de url /iets/ worden omgezet in ?page=iets. So far so good. Het probleem zit hem in het feit dat ik voor elke pagina met verschillende variabelen werk. Zo heeft de nieuwspagina de opbouw: ?page=nieuws&nid=1, maar de productenpagina heeft bijvoorbeeld weer ?page=producten&prodid=5&art=Kast.

Als ik dan een rewrite regel maak die /iets/iets omzet naar ?page=iets&nid=iets, werkt het wel op de nieuwspagina, maar niet op de productenpagina.

Ik heb dus eigenlijk een stuk of wat verschillende rewrite regels nodig binnen 1 site, omdat iedere pagina met verschillende variebelen werkt. Daar is vast een oplossing voor, maar ik kan hem niet vinden.

Ik zou het super fijn vinden als jullie me op de goede weg kunnen helpen.


Hier nog even een lijstje met wat variabelen per pagina:

Home: ?page=iets
Nieuws: ?page=nieuws&nid=iets
Producten: ?page=producten&nav=iets&lijn=iets
Product: ?page=product&id=iets&naam=iets
Offerte: ?page=offerte&stap=iets&verzenden=iets

Etc.

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 09:14
Je moet zoiets doen:

code:
1
2
3
4
5
Options -Indexes
RewriteEngine on
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?pageid=$1&page=$2&operation=$3 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?pageid=$1&page=$2 [L]
RewriteRule ^([^/\.]+)/?$ index.php?pageid=$1 [L]


Gewoon beginnen met de langste string en daarna steeds lager gaan :) Die [L] zorgt er voor dat als hij de bovenste pakt, hij niet ook nog eens alle anderen uitvoert.

Acties:
  • 0 Henk 'm!

Verwijderd

Nee! Niet doen.

Pak één enkele RewriteRule en zorg ervoor dat die alle URL's afvangt die je PHP script kan afhandelen. In het PHP script kun je vervolgens naar de waarde van $_SERVER['REQUEST_URI'] kijken en bepalen hoe de request verwerkt moet worden.

It makes perfect sense. Je applicatie moet sowieso op een of andere manier URL's opbouwen, het is logisch dat ook het analyseren van de URL door de applicatie zou moeten gebeuren.

Je wilt niet teveel RewriteRule's, het gaat uiteindelijk toch niet mooi werken als je applicatie te ingewikkeld wordt.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik onderschrijf Cheatah hier graag. Gewoon alles afserveren naar index.php en daar de request verder afhandelen. Op die manier hoef je ook niet steeds je htaccess aan te passen als je je site uitbreidt. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NeilForeal
  • Registratie: Oktober 2006
  • Laatst online: 16-12-2024
Klinkt logisch heren :) Ik ben enthousiast!

Ik weet technisch gezien echter nog niet precies wat jullie bedoelen. Welke enkele regel zou ik dan moeten instellen? Eentje waar echt alle variabelen in zitten die in de hele website zitten? Dat kunnen er dus wel 10 zijn.

Vervolgens moet ik het opvangen met de URL en dmv een leuk explode scriptje goed verwerken?

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

NeilForeal schreef op zaterdag 20 november 2010 @ 13:21:
Klinkt logisch heren :) Ik ben enthousiast!

Ik weet technisch gezien echter nog niet precies wat jullie bedoelen. Welke enkele regel zou ik dan moeten instellen? Eentje waar echt alle variabelen in zitten die in de hele website zitten? Dat kunnen er dus wel 10 zijn.

Vervolgens moet ik het opvangen met de URL en dmv een leuk explode scriptje goed verwerken?
Gewoon zo:

code:
1
2
Options Multiviews
RewriteRule ^(.*) index.php/$1 [L]


en dan in index.php zelf die url uit de REQUEST_URI halen en bedenken wat ermee moet.

Dit is een stukje uit een van mijn vhosts:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <Directory "/srv/www/blabla/etc">
        Options -Indexes FollowSymLinks MultiViews

        AllowOverride AuthConfig Limit

        Order allow,deny
        #Deny from all
        Allow from all

        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ /index.php/$1
    </Directory>

[ Voor 25% gewijzigd door CyBeR op 20-11-2010 13:26 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • NeilForeal
  • Registratie: Oktober 2006
  • Laatst online: 16-12-2024
Dat ziet er inderdaad uit als een breed inzetbare oplossing, daar ga ik mee werken!

Ik lees overal dat ik de rewrite rule in een .htaccess bestand moet plaatsen. Jij hebt het over een vhosts? Hoe zit dat?

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Zeg, een beetje zelf uitzoeken kan ook geen kwaad ;)

Je vhosts.config / httpd.config is een stukje Apache-configuratie wat wordt geladen bij het starten van de webserver en geldt voor de hele virtuele directory en zijn subdirectories. Een .htaccess-bestand geldt pas vanaf de directory waar 'ie in staat en dieper en moet je vaak gebruiken bij shared hosting omdat je geen toegang hebt tot de Apache-configuratie. Ook kunnen de in de .htaccess te overschrijven regels worden bepaald in de serverconfiguratie, met AllowOverride.
However, in general, use of .htaccess files should be avoided when possible. Any configuration that you would consider putting in a .htaccess file, can just as effectively be made in a <Directory> section in your main server configuration file.

[ Voor 35% gewijzigd door CodeCaster op 20-11-2010 18:27 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

CyBeR schreef op zaterdag 20 november 2010 @ 13:25:
[...]


Gewoon zo:

code:
1
2
Options Multiviews
RewriteRule ^(.*) index.php/$1 [L]
Dat kan ook zonder Multiviews. :)
code:
1
2
3
4
5
6
7
8
9
# Handle all URLs in the code
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

NMe schreef op zaterdag 20 november 2010 @ 13:40:
[...]

Dat kan ook zonder Multiviews. :)
code:
1
2
3
4
5
6
7
8
9
# Handle all URLs in the code
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php \[L]
</IfModule>

;)
Mja. Nouja meerdere wegen naar parijs he ;)

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • NeilForeal
  • Registratie: Oktober 2006
  • Laatst online: 16-12-2024
Bedankt voor de snelle antwoorden zover.

Ik ben er nu mee bezig en het opvangen van de URIs gaat prima. Ik loop nu alleen nog aan tegen het feit dat alle afbeeldingen en verwijzingen vanuit de website niet meer werken zodra ik met meer dan 1 variabele werk. /nieuws/5 bijvoorbeeld. Alle standaard pagina's pakt hij wel, zodra ik met 1 variabele werk. Zo werkt /home, /nieuws, /producten etc.

Komt dit omdat de htaccess file ervoor zorgt dat alle externe bestanden (images in de img/plaatje.jpg map en css bestanden ed) niet vanuit de root worden pakt zoals dat normaal gesproken is? Zo ja, hoe kan ik ervoor zorgen dat de url geen invloed heeft op de paden binnen mijn php bestanden?

Als het logo in images/logo.jpg staat, werkt deze natuurlijk niet meer vanuit /nieuws/5/images/logo.jpg, omdat het /images/logo.jpg is. Ik neem aan dat iedereen tegen dit probleem aanloopt, dus er zal allicht een oplossing zijn.

Mijn htaccess is momenteel zo:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

[ Voor 21% gewijzigd door NeilForeal op 20-11-2010 18:32 ]


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Als je eerst dit had:

www.example.com/index.php?page=nieuws

dan wordt de url "image/logo.jpg" door de browser op gevat als www.example.com/image/logo.jpg

Maar nu heb je:
www.example.com/nieuws/

en dan wordt de link naar datzelfde logo opgevat als: www.example.com/nieuws/image/logo.jpg. En die bestaat niet.

Je moet dus absolute url's gebruiken voor je links, dus altijd beginnen vanuit je root.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

rutgerw schreef op zaterdag 20 november 2010 @ 19:03:
Je moet dus absolute url's gebruiken voor je links, dus altijd beginnen vanuit je root.
Of gewoon base gebruiken :)

[ Voor 36% gewijzigd door CodeCaster op 20-11-2010 19:14 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • NeilForeal
  • Registratie: Oktober 2006
  • Laatst online: 16-12-2024
Wow, dat base is echt ideaal! 1 regeltje en alles werkt weer, super!

Om overal volledige URLs in te gaan vullen leek me niet echt handig, aangezien ik de mod rewrite op een bestaande nogal grote website toepas. Dan gaat het erg veel werk worden.

Bedankt!

Edit
Ik ben zo goed als klaar met de rewrite, zonder jullie hulp was het allemaal een stuk langzamer gegaan!

Ik merk 1 ding op, de website is een behoorlijk stuk trager geworden. Elke pagina inladen duurt een aantal seconden, terwijl dat eerst instant was. Kan dat komen door de rewrite? Is dat een bekend fenomeen?

[ Voor 38% gewijzigd door NeilForeal op 20-11-2010 20:09 ]


Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 11-09 12:17
Bekijk eens met Firefox Pagespeed of een vergelijkbare tool waar 't aan ligt?
Ik heb in ieder geval geen last van tragere sites met .htaccess en mod_rewrite.

Acties:
  • 0 Henk 'm!

  • NeilForeal
  • Registratie: Oktober 2006
  • Laatst online: 16-12-2024
Ik denk dat ik de snelheid voor een groot deel heb opgelost. Ik had de <base> tag onder een aantal javscript files gezet, daar bleef de browser op hangen. Het werkt nu een stuk beter, hoewel ik nog steeds iets het idee heb dat het wat trager is. Maar dat zoek ik zelf wel even uit :)

Bedankt!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Nogmaals: PageSpeed of YSlow installeren, dan vind je dat wel. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1