THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline

#1 urls zarbis et le remède

(15-11-2009 13:08:12)


Bonjour,

j'ai passé le ht.access en RewriteEngine off
et passé toutes les balises #REWRITEURL des pages html en simple #URL.
Pour mieux contrôler la mise au point de la navigation.

Je repasserai en urls propres si tout va bien avant la mise en production.

si j'appelle une page avec une langue spécifique, par exemple :

dossier.php?id_dossier=7&lang=3

j'obtiens bien dans la barre d'adresse :

dossier.php?id_dossier=7&lang=3

mais #URL_COURANTE ou #URL_COURANTEPARAM
ainsi que
echo $_SERVER['REQUEST_URI'];
rendent :

"dossier.php?id_dossier=7〈=3"

"&lang" est remplacé intempestivement par "〈"

(Testé seulement dans Firefox).

--------------------------------------------------
La réponse in english (of course):

Ampersands (&'s) in URLs

Another common error occurs when including a URL which contains an ampersand ("&"):

<!-- This is invalid! --> <a href="foo.cgi?chapter=1&section=2&copy=3&lang=en">...</a>

This example generates an error for "unknown entity section" because the "&" is assumed to begin an entity reference. Browsers often recover safely from this kind of error, but real problems do occur in some cases. In this example, many browsers correctly convert &copy=3 to ©=3, which may cause the link to fail. Since 〈 is the HTML entity for the left-pointing angle bracket, some browsers also convert &lang=en to 〈=en. And one old browser even finds the entity §, converting &section=2 to §ion=2.

To avoid problems with both validators and browsers, always use & in place of & when writing URLs in HTML:

<a href="foo.cgi?chapter=1&section=2&copy=3&lang=en">...</a>

Note that replacing & with & is only done when writing the URL in HTML, where "&" is a special character (along with "<" and ">"). When writing the same URL in a plain text email message or in the location bar of your browser, you would use "&" and not "&". With HTML, the browser translates "&" to "&" so the Web server would only see "&" and not "&" in the query string of the request.

--------------

http://209.85.229.132/search?q=cache:pu … clnk&gl=fr

le lien est celui d'un cache Google, parce que la page à jour, est traduite en français et largement édulcorée.

--------------

Epilogue

La correction fonctionne bien en direct à l'intérieur d'une page, mais il n' y a pas de remède facile que je connaisse, lorsque l'adresse est récupérée par les moyens sus-décrits.

Faut-il écrire un filtre qui remplace "〈" par "&lang" pour afficher l'adresse ?
Patcher le fichier substitution ?
Il aurait peut-être mieux valu ne pas utiliser "lang" pour passer la variable dans l'adresse ?

Attention ne pas confondre "<" (<) et "〈" (〈).

Last edited by Léon (15-11-2009 17:31:48)

Offline


Bonjour,

Oui mais si tu édites le code source de ta page tu as bien &lang et non (.

Donc normalement cela ne génère aucun problème, car l'url appelé prend en compte le code source et non le code affiché.

Alfouine,


Au royaume des aveugles, les borgnes sont mal vus.

Offline


Non Alfouine, le code source affiche "〈".

La barre url affiche correctement.

J'ai besoin de tester l'url pour faire fonctionner correctement mon système de boutons de langue.

Mais j'ai détourné le problème, en testant par défaut.

Last edited by Léon (15-11-2009 17:30:50)

Offline


Tu peux filer une url pour tester ?


Aide les autres, ils t'aideront en retour.

Offline


Salut Elyos,

je détaille un peu plus. Pour le moment je suis en local.

Appel de la page :
... else   // params divers + le language ?
{
$urltab=explode("&lang",$urltemp);// on saucissonne
$sep="&";
$preurl=$urltab[0];
$url=$preurl.$sep; // construction nouvelle url
}
echo '<a class="bt-es'.$eson.'" ';
echo $eshref.'="'.$url.'lang=3"></a>

Ce qui en clair donne :
shop3/rubrique.php?id_rubrique=2&lang=3

----------------
A l'arrivée :

Barre url : shop3/rubrique.php?id_rubrique=2&lang=3

Code source de la page sur le serveur : <p>URL COURANTE #URLCOURANTE</p>

Code source de la page publiée : <p>URL COURANTE /shop3/rubrique.php?id_rubrique=2〈=3</p>

Affichage page : URL COURANTE /shop3/rubrique.php?id_rubrique=2〈=3

et voili.

Offline


ça serait pas plus simple de faire un

$url=str_replace("&lang", "&lang", $urltemp);

Aide les autres, ils t'aideront en retour.

Offline


Merci Elyos, effectivement c'est plus concis. Je vais corriger mon script

Je suis toujours un peu laborieux, dans l'écriture de code. J'ai besoin de bien décomposer pour suivre le processus.

Ce n'est pas mon activité principale.

Offline


Salut Elyos,

j'ai mis en application ta formule. Toutefois, mon assemblage fonctionne aussi si le "&lang" n'est pas présent dans l'url analysée, ce qui est nécessaire au bon fonctionnement.

Mais tu n'avais pas une vue globale de tout le code.

J'ai 3 cas de figure pour l'analyse de l'url en cours :

- pas de paramètre : on ajoute un ? avant lang
- ?lang : on le remplace par le nouvel ?lang
- paramètres divers seuls ou paramètres divers + &lang :
on ajoute ou on remplace &lang.

Mon commentaire qui a induit ta réponse est corrigé en :

else   // params divers ou  params divers + language ?
et puis ce n'est pas tout de remplacer, il faut d'abord faire disparaitre la trace de la langue en cours avant de changer.

Je vais condenser un peu le code.

le cas n°3 devient :

$urltab=explode("&lang",$urltemp);// on saucissonne
$url=$urltab[0]."&"; // construction nouvelle url

Il y a peut être plus pro avec les sessions etc. mais ce n'est pas de mon niveau.
Ça viendra un peu plus tard.

Merci.

Last edited by Léon (17-11-2009 23:21:25)