2013-02-14 3 views
0

J'ai vu beaucoup de gens ayant ce problème et il semble que la seule façon d'arrêter Apache traitant l'esperluette encodée et une esperluette d'URL est-elle d'utiliser le drapeau de réécriture B, RewriteRule^(. * $ index.php? path = $ 1 [L, QSA, B]. Cependant, ceci n'est pas disponible dans les versions antérieures d'Apache et doit être installé, ce qui n'est pas non plus supporté par certaines sociétés d'hébergement.Utilisation de l'esperluette dans de jolies URL URL

J'ai trouvé une solution qui fonctionne bien pour nous. Nous avons une url/recherche/résultats/à emporter + Foods/Inverchorachan, + Argyll + & + Bute +

Ce casse évidemment l'url à & nous donner/Recherche/résultats/Plats à emporter + Foods/Inverchorachan, + Argyll qui donne alors une erreur 404 car il n'y a pas une telle page.

L'URL est contenue dans le tableau $ _GET ['url']. S'il trouve un &, il divise le tableau pour chaque perluète.

Le code suivant restitue l'URL en parcourant le tableau $ _GET pour chaque pièce.

Je voudrais savoir si cela a des problèmes cachés dont je ne suis peut-être pas au courant.

Le code:

$newurl = ""; 
    foreach($_GET as $key=>$pcs) { 
     if($newurl=="") 
      $newurl = $pcs; 
     else 
      $newurl .= "& ".rtrim($key,"_"); 
    } 
    //echo $newurl;exit; 
    if($newurl!='') $url=$newurl; 

Je parage le trait de soulignement de la pièce comme apache ajouté. Je ne sais pas pourquoi, mais toute aide serait formidable.

+0

Peut-être connecté, mais vous devriez échapper cela et dans l'URL. – Joe

Répondre

0

Nous avons eu ce correctif en place depuis deux semaines maintenant, je crois que cela a résolu le problème. J'espère que cela aidera quelqu'un avec un problème similaire que j'ai cherché pendant des semaines pour une solution en dehors d'une mise à niveau d'apache pour inclure le drapeau B. Nos utilisateurs peuvent maintenant taper dans le lit & Petit déjeuner et nous pouvons alors servir la page appropriée.

Voici le correctif en PHP.

$newurl = ""; 
foreach($_GET as $key=>$pcs) 
{ 
    if($newurl=="") 
     $newurl = $pcs; 
    else 
     $newurl .= "& ".rtrim($key,"_"); 
} 

if($newurl!='') $url=$newurl; 
0

Jetez un oeil à urlencode:

Vous pouvez également remplacer le « & » char avec quelque chose ne pas casser l'URI et ne sera pas interprété par apache comme le « | » carboniser.

+0

Apache casse toujours une esperluette codée. Nous voulons que l'URL affiche l'esperluette, donc il n'est pas possible de la remplacer par d'autres caractères. – karmafunk

+0

Une solution pour vous est de jouer avec l'historique du navigateur et de générer une URL "fausse", de les intercepter avec javascript et de les transformer avant de les soumettre au serveur web. – robinef

+0

robinef a une bonne idée, pourquoi ne pas simplement remplacer toutes les instances de '&' par 'et'? Transformer le «bed & breakfast» en «bed and breakfast» n'irritera probablement personne. – Josh

2

Vous avez dit dans un cooment:

Nous voulons l'URL de montrer l'esperluette si la substitution avec d'autres caractères ne sont pas une option.

Réponse courte: Ne le faites pas. Sérieusement, n'utilisez pas les esperluettes de cette façon dans les URL. Même si c'est joli. Ampersands ont une signification particulière dans une URL et en essayant d'outrepasser cette signification, car il est beau est un très mauvaise idée.

La plupart des logiciels basés sur le Web (y compris Apache, PHP et tous les navigateurs) font des suppositions sur ce que signifie un esperluette dans une URL, que vous trouverez très difficile à contourner. En particulier, vous allez complètement confondre Google et les autres moteurs de recherche si vous avez des esperluettes arbitraires dans l'URL, ce qui détruira complètement votre classement SEO.

Si vous devez avoir une perluète dans la chaîne, utilisez la fonction de codage url pour la convertir en URL %26. Cela ne semblera pas bien dans la chaîne d'URL de l'utilisateur, mais cela fonctionnera comme prévu.

Si ce n'est pas acceptable, remplacez-le par un objet différent pour les esperluettes; peut-être le mot "et", ou un caractère comme et soulignent, ou peut-être simplement le retirer de la chaîne sans un remplacement.

Tous ces éléments sont courants. Essayer de forcer l'URL à avoir un véritable caractère d'esperluette n'est pas une pratique courante, et pour une très bonne raison.

+0

C'est hors de notre contrôle, car un utilisateur tapera dans le lit et le petit déjeuner, donc nous devons répondre à cela. Bien sûr, nous l'encodons mais apache le divise encore. Nous avons eu ma solution en place depuis quelques semaines maintenant sans problèmes, donc je crois que cela est résolu. – karmafunk

Questions connexes