2010-01-08 6 views
2

J'ai lutté avec cela pendant deux jours en ce moment..htaccess mod rewriterule et ampersands

Au moment où j'ai la règle suivante:

RewriteRule ^(.*)$ index.php?u=$1 [NC,L] 

ports où tout derrière example.com/ à index.php comme variable GET u. Qui est en cours de traitement dans index.php avec une explosion pour définir te différents arguments étant: la ville (entre les première barre oblique) en la position (le deuxième argument)

Cela fonctionne parfaitement pour les adresses suivantes:

example.com/City/location/ ou example.com/City/location
example.com/City/ ou example.com/City

qui produit:

$arg[0] = city 
$arg[1] = location 

le problème se produit lorsque le Locat ion a une esperluette au nom de l'emplacement:

example.com/city/location&more 

se traduit:

index.php?u=city/location&more 

Le problème est évident; Je ne peux plus utiliser le paramètre explode dans index.php parce que la seconde partie du nom d'emplacement n'est pas stockée dans $ _GET ['u'].

Comment puis-je résoudre ce problème?

Je pense que trois solutions que je ne sais pas comment mettre en œuvre:
1) la réécriture de la règle de réécriture de diviser la ville et l'emplacement dans le .htaccess
2) en utilisant un .htaccess équivalent de urlencode pour transformer le & -sign à% 26
3) une autre solution complète :)
Merci d'avance!

Modifier Premièrement: Lorsque le lien est produit par mon site, il est traduite avec urlencode. Il n'y a donc pas de & où il ne devrait pas y en avoir un. Le & fait partie d'un nom d'entreprise comme: "Bagels & Beans" Lorsque les gens veulent rechercher cette entreprise, ils tapent: www.example.com/city/bagels & haricots dans l'url-field. ET c'est là que le problème commence.

modifier 2 Quand je vais à: example.com/city/bagels%26Beans il se traduit par ce qui suit: $ _GET:

Array 
(
    [u] => city/Bagels 
    [Beans] => 
) 

modifier 3 La façon dont j'exploser la $ _GET ['u'] pour former les arguments.

$arg = explode('/',$_GET['u']); 
+0

Quel est le code PHP que vous utilisez pour l'explosion? (qu'est-ce que vous exploser sur?) –

+0

Je l'ai mis dans ma question, à l'édition 3 – blub

Répondre

3

Vous n'avez pas besoin de placer le chemin d'URL dans un argument. Vous pouvez simplement analyser le chemin demandé original comme ceci:

$_SERVER['REQUEST_URI_PATH'] = strtok($_SERVER['REQUEST_URI'], '?'); 
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 

Maintenant, tout ce dont vous avez besoin est cette règle de réécrire la demande à votre index.php:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^index\.php$ index.php [L] 

La condition supplémentaire est seulement réécrire les demandes qui ne peuvent pas être mappées sur des fichiers existants.

0

Vous ne devriez pas avoir & dans le cadre d'une URL exactement pour cette raison.& a une signification particulière, et devrait être encodé (%26) chaque fois qu'il est placé dans un tag a sur votre site, de sorte que vous ne devriez jamais le voir apparaître comme & dans l'URL. Fondamentalement, ce que je dis, c'est de ne pas gérer cela dans votre htaccess, gérer ceci dans tout code mauvais qui permet à un & d'être sorti dans le cadre d'une URL.

+0

Chaque fois que je produis le nom de la base de données, je l'adresse à% 26. Mais même alors, il se trompe - s'il vous plaît regarder mon edit – blub

2

Pour commencer:

example.com/city/location&more 

n'est pas une chaîne de requête valide. Vous devriez commencer les chaînes de requête avec ?, comme ceci:

example.com/city/location?more=value&more2=value2 

En second lieu, il y a un modificateur dans mod_rewrite pour assurer les chaînes de requête s'ajoutés à votre nouveau réécrites URLS, ce qui est QSA (ce qui signifie append chaîne de requête). Votre règle de réécriture ressemblerait à ceci:

RewriteRule ^(.*)$ index.php?u=$1 [NC,QSA,L] 
+0

l'esperluette fait partie du nom et pas un argument! – blub

+0

@blub: Dans ce cas, vous devez encoder l'esperluette. –

+0

Jetez un coup d'oeil à mon deuxième edit: même quand je l'ai encodé en% 26, la variable GET se trompe. – blub

2

Vous pouvez essayer d'utiliser $ _SERVER [ "REQUEST_URI"] au lieu de l'argument réel _GET $.

if(preg_match("%\?u=(.*)$%", $_SERVER["REQUEST_URI"], $Matches)) { 
    $Test = explode("/", $Matches[1]); 
    var_dump($Test); 
} 

Par "index.php u = test/testlocation & plus?" Ce qui donne en sortie:

tableau

(2) {[0] => string (4) "test" [1 ] => string (17) "testlocation & en savoir plus"}