[Apache/PHP] Dynamisch Mod_rewrite systeem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 16:37

Basszje

Reisvaap!]

Topicstarter
Ik heb hier even een probleem waar ik niet uit kom . Ik ben bezig met een soort van template systeem waarbij er slechts de hele applicatie een enkele file voor alles zorgt. Van class includes totaan variable checking and handling. Dit scheelt code en fouten in de subpagina's van de site.

De bedoeling is dus dat het uiteindelijke script over alle variabelen beschikt die die nodig heeft en die gebruikt.

Nav dit voornemen komen dus alles post en get variabelen uit een voorgedefineerde array ( per pagina ) die ze vervolgens checkt ( bestaan ze al, goede type etc ) .

dat ziet er zo uit :

PHP:
1
2
$scriptGetArray = array("topic" => array("forum_id" => "int")
    );


Topic is dan de huidige pagina.

Dit werkt nu allemaal. Vervolgens wil ik dat de aanroep als volgt geschied ( van de pagina ) http://server/topic/321 ( ipv /index.php?page=topic&topic_id=321 )

Daarvoor heb ik een modrewrite gebouwd :

code:
1
2
3
4
5
RewriteEngine on 
# Not for the templates (stylesheets / images ) 
RewriteCond %{REQUEST_URI} !^/php/vrijwazig/template(.*)
RewriteCond %{REQUEST_URI} ^/php/vrijwazig/([A-Z]+|[a-z]+)
RewriteRule ^(.*) /index.php?page=$1 [L]


Voila :)

Het probleem is nu dat verschillende pagina's bij mij verschillende hoeveelheden en typen get variabelen hebben.

Om dat op te lossen had ik bedacht in mijn GET var handler de eerste variabele op te halen ( ALTIJD de page var) en de anderen te nummeren. var0=321 bv . Dan kan ik op basis van de volgorde van de eerder genoemde get/postvar Array de variabelen weer terugzetten op hun eigen naam.

Mijn vraag is nou hoe je dit precies doet in de RewriteRule ( lastige materie ) en of dit nou de handigste manier is.

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Acties:
  • 0 Henk 'm!

  • Kippenijzer
  • Registratie: Juni 2001
  • Laatst online: 26-08 09:08

Kippenijzer

McFallafel, nu met paardevlees

Zomaar de vraag waarom je hiervoor mod_rewrite wilt gebruiken, en niet gewoon apache's MultiViews gebruikt, en dan php zelf de url parsing laat doen. Lijkt me lichter en makkelijker bij variabele aantallen...

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Kippenijzer schreef op 04 september 2004 @ 16:38:
Zomaar de vraag waarom je hiervoor mod_rewrite wilt gebruiken, en niet gewoon apache's MultiViews gebruikt, en dan php zelf de url parsing laat doen. Lijkt me lichter en makkelijker bij variabele aantallen...
yup, zo doe ik dat ook, alleen even $_SERVER["PATH_INFO"] exploden en je kan er zo alles uithalen :)

Acties:
  • 0 Henk 'm!

  • Kippenijzer
  • Registratie: Juni 2001
  • Laatst online: 26-08 09:08

Kippenijzer

McFallafel, nu met paardevlees

inderdaad, da's veel flexibeler, en scheelt je mod_rewrite materie :)
Die moet je alleen voor vieze cross ip vhost rewrites over NAT sockets gebruiken... Hmm, wat zeg ik hier eigenlijk? ;)

[ Voor 3% gewijzigd door Kippenijzer op 04-09-2004 16:43 ]


Acties:
  • 0 Henk 'm!

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 16:37

Basszje

Reisvaap!]

Topicstarter
Is het dan ook mogelijk om een structuur te krijgen ala : http://server/topic/321 ?
Ik wil namelijk niet dat al die variabelen in de get URL komen te staan als het even kan :)

En Multiviews :? Ga ik wel even op googlen :)

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Acties:
  • 0 Henk 'm!

  • Joen
  • Registratie: Juli 2003
  • Laatst online: 09-08 18:34
Let er op dat er bij Apache2 hier andere instellingen voor benodigd zijn dan met Apache1. Met alleen Multiviews ben je er bij Apache2 dus niet. ;) :P
Ik weet zo helaas even niet uit mn hoofd hoe je het dan exact moet instellen.

Acties:
  • 0 Henk 'm!

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 16:37

Basszje

Reisvaap!]

Topicstarter
Even een subtiel schopje :P

Ik heb nu zoiets gefabriceerd :

code:
1
2
3
RewriteCond %{REQUEST_URI} !^/php/vrijwazig/template(.*)
RewriteCond %{REQUEST_URI} ^/php/vrijwazig/(.*)
RewriteRule ^([a-z0-9]+)
(.*) /index.php?page=$1?var=$2 [L][/code]

Waarbij dus de overige variabelen in $2 terecht komen . Op zich prima, maar als er niets is achter die bewuste / dan wil ik die var eigenlijk ook niet meegeven. Dat is 1 probleem.

Tweede probleem is dat je nu elke page MET die slash moet aanroepen ipv gewoon /pagina . Dat is een bekend probleem I know, maar ik kom er maar niet uit.

Ik wil dus een soort if slash dan doe page=$1?var=$2 anders doe gewoon page=$1

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ik zou toch voor de multiviews gaan hoor. ;)

Voorbeeldje van de werking op deze site van mij.

deeltje uit de constructor van mn core class:

PHP:
1
      $this->request_array = explode("/", $_SERVER["REQUEST_URI"]);


en de functie om de vars mee op te halen:

PHP:
1
2
3
4
5
6
7
    public function retRequestArray($index="")
    {
      if(!$index) return $this->request_array;
      if(isset($this->request_array[$index]))
        return $this->request_array[$index];
      else return false;
    }


Uiteraard kun je de nutteloze lege vars met key 0 (leeg), en key 1 (index.php, in mijn voorbeeld), er alvast uithalen.

Als je meer info nodig hebt, hoor ik het wel..

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Kaasplank
  • Registratie: Februari 2001
  • Niet online
voor m'n forum heb ik een .htaccess:
code:
1
2
3
4
5
AcceptPathInfo On

<Files forum>  
 ForceType application/x-httpd-php  
</Files>


forum is een bestand zonder extensie waar iets als dit in staat:
PHP:
1
$url_array=explode("/",$_SERVER['REQUEST_URI']);


dit kan ik aanroepen met
/forum/test/1/2/3

in test.php zijn dan 1, 2 en 3 als $url_array['1] enz. beschikbaar

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Waarom wordt hier MultiViews aangeraden :? Je kunt met mod_rewrite alles wat je met MultiViews kunt en meer.

code:
1
2
3
4
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI}    !^/template.*
RewriteRule ^.*$ index.php


als je dan naar /a/b/c/d/e/f gaat en in index.php in $_SERVER [ 'REQUEST_URI' ] kijkt, zie je gewoon de opgevraagde uri staan en kun je daarmee klooien wat je wilt. Het enige nadeel is dat je browser dan denkt dat je in een "diepere" directory zit, en je dat dus op moet heffen bij je stylesheet verwijzingen e.d., of daarvoor even een aparte RewriteRule op moet zetten:
code:
1
RewriteRule .*/template/(.*) /template/$1

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 16:37

Basszje

Reisvaap!]

Topicstarter
Ik heb even wat gekloot eraan en het werkt inderdaad zo wel :) . Met die template RewriteRule er ook bij. Dom eigenlijk dat het zo simpel ook kon, zat veel te moeilijk te denken.

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Overigens is het i.v.m. caching door de client wel netter om de stylesheet/graphics verwijzingen aan te passen ipv er een rewrite voor te maken. Je kunt daarvoor absolute verwijzingen maken met een define :
code:
1
define ( 'HTTP_ROOT', '/the-absolute-root/' );

of in de je script even de "diepte" van het pad uitvogelen met iets van deze strekking:
code:
1
2
$params = explode ( '/', $_SERVER [ 'REQUEST_URI' ] );
$HTTP_ROOT = str_repeat ( '../', count ( $params ) );

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1