Moderator |
|
Dit hangt een beetje van je instellingen af, maar normaal gesproken is het default bestand dat wordt geladen in elke directory "index.php", dit is de DirectoryIndex instelling. Dit is ook iets om te onthouden voor als je RewriteRules niet voldoen.
Het werkt niet zoals je verwacht omdat je RewriteRule een "catch all" is, het patroon ^(.*)$ vangt alles. Wat je moet doen is hier nog een aantal condities aan opleggen zodat "alles", maar onder bepaalde omstandigheden, wordt herschreven. Je moet de RewriteRule vertellen dat de URL niet herschreven mag worden als je met een bestaand bestand of een bestaande directory van doen hebt, deze hebben dan "voorrang" op de RewriteRule. Dit doe je als volgt:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ test.php?var=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ test.php?var=$1 [L,QSA]
En als ik je een tip mag geven, als je dan toch van deze constructie gebruik maakt zou ik kiezen om gewoon alles om te schrijven naar test.php (of index.php of wat dan ook), en dit niet in aan de querystring-variabele "var" toe te kennen. Je reserveert hiermee namelijk de variabele "var" wat voor onvoorspelbaar gedrag kan zorgen. Stel nu dat iemand zelf &var=... aan een URL plakt?
Ik zou dus zoiets doen:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . test.php [L]
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule . test.php [L]
Dat lijkt mij de "schoonste" manier. Je querystring-variabelen blijven gewoon op de gebruikelijke manier toegankelijk (via $_GET in PHP) als je je daar zorgen over maakt.
Daarnaast zit alles nog in je REQUEST_URI. PHP heeft handige functies voor het snel ontleden van een URL (parse_url en parse_str):
<?php
function dump($a) {
echo '<pre>'.print_r($a, true).'</pre>';
}
$test = @parse_url($_SERVER['REQUEST_URI']);
$querystring = array();
if (isset($test['query'])) {
parse_str($test['query'], $querystring);
}
dump($test);
dump($querystring);
?>
<?php function dump($a) { } if (isset($test['query'])) { } dump($test); dump($querystring); ?>
|