2010-06-30 2 views
0

J'ai une solution mais c'est celle que je connais qui n'est pas la meilleure et qui devrait être résolue avec une réécriture complète. Fondamentalement, j'ai 3 réécritures qui iront aux zones correctes que je veux et faire ce qu'ils doivent faire. Cependant, pour passer d'un endroit à l'autre, je devais écrire une classe d'URI pour supprimer l'URL et définir manuellement la page et les vars. Tout fonctionne très bien, mais les URL sont une douleur dans le cul spécialement si elle n'est pas formatée exactement.Problème de réécriture d'Apache, URI personnalisé

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/bsiadmin/$ /bsiadmin/index.php [L,QSA] 
RewriteRule ^/bsiadmin/(.+)/$ /bsiadmin/index.php?page=$1 [L,QSA] 
RewriteRule ^/(.+)/$ /index.php?page=$1 [QSA] 

La première règle se chargera de diriger tout le répertoire et non le index.php racine, la deuxième règle fait la même chose s'il y a une « page » spécifiée. La dernière règle prendra n'importe quoi d'autre et s'assurera qu'elle utilise la racine index.php et part de là.

Exemple de urls:

http://mysite.test/icecream/id=2/ 

Ma classe uri personnalisée dépouillent cet identifiant propre et défini comme un _REQUEST de $ var.

Je suppose que ce que je veux vraiment savoir comment je peux simplement réécrire une URL simple comme:

http://mysite.test?page=icecream&id=2 

AS

http://mysite.test/icecream/id/2/ 

Sans aucune limitation sur le nombre de vars peut être passé et le répertoire qui existe "bsiadmin" à afficher sans que je doive utiliser une classe uri pour le diriger.

Merci pour l'aide.

Répondre

2

Vous pouvez utiliser mod_rewrite pour le faire:

RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/(.*) /$1/$4?$2=$3 [N,QSA] 
RewriteRule ^/([^/]+)/$ /bsiadmin/index.php?page=$1 [L,QSA] 

Mais je pense que le mieux serait d'utiliser PHP pour ce travail. Parce qu'avec mod_rewrite vous ne pouvez réécrire qu'une quantité fixe d'arguments d'URL à la fois (ici une à chaque réécriture). Avec PHP, vous pouvez analyser un nombre arbitraire d'arguments comme ceci:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
$segments = explode('/', $_SERVER['REQUEST_URI_PATH']); 
if (count($segments) > 2) { 
    for ($i=4, $n=count($segments); $i<$n; $i+=2) { 
     $_GET[rawurledecode($segments[$i-1])] = rawurldecode($segments[$i]); 
    } 
    $_GET['page'] = rawurldecode($segments[1]); 
} 

Ensuite, tout ce dont vous avez besoin pour mod_rewrite est cette règle unique de réécrire les requêtes à votre index.php:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule !^/bsiadmin/index\.php$ /bsiadmin/index.php [L] 
+0

Exactement ce que Je cherchais, merci beaucoup! – Dreamcube