Boucle de redirection

Nouveau WRInaute
Bonjour,

J'ai un fichier .htaccess dans lequel j'ai inserer un code qui redirige les visiteur en fonction de leur pays.
Toute fois j'ai une boucle de mauvaise redirection.

J'ai lu le tuto sur les boucles de redirection qui semble tout à fait répondre à mon problème, mais n'arrive pas à adapter le script à mon propre code (...développeur très junior!!!):

RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US [NC]
RewriteRule ^$ /?lang=us [L,R=301]

Si quelqu'un peut m'aider...!!!


Merci beaucoup!!
 
WRInaute discret
Ce qui se passe ici en gros, c'est que http://www.site.com/ sera redirigé vers http://www.site.com/?lang=us si l'utilisateur est US. Mais la règle produit une boucle car ^$ match à chaque fois.

Astuce pour votre cas:

Code:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US [NC]
RewriteCond %{QUERY_STRING} !^lang=us$ [NC]
RewriteRule ^$ /?lang=us [L,R=301]
 
Nouveau WRInaute
Bonjour Giustino!

Merci pour ta réponse! toutefois pour un IP US, cet réécriture renverra vers ?lang=US dans tout les cas même si je sélectionne Lang=Fr. J'ai un site multi lingue donc cette solution n'est pas possible dans mon cas !
Ce qu il faudrait c'est dire qu'une fois que la redirection à été faite une fois , il s’arrête et ne prend plus ça en compte. je pense que c'est ce que tu as fais avec REDIRECT_BREAK dans le tuto si bien expliqué sur les boucles de redirection, mais que je n'arrive pas à transposer dans mon cas.

Si tu as une autre solution je suis preneuse!!!! Merci encore!
 
WRInaute discret
smit a dit:
toutefois pour un IP US, cet réécriture renverra vers ?lang=US dans tout les cas même si je sélectionne Lang=Fr

Je ne suis pas certains de bien comprendre car avec le code que j'ai donné précédemment, l'utilisateur ne sera redirigé que si il est US et que l'url ne contient pas déjà "lang=us" en paramètre. On évite donc la boucle. Peux-tu préciser le problème dans ce cas précis ?

Par contre, que ce ne soit pas générique pour un site multilingue, ça, je veux bien l'admettre. Mais il y a une solution à ça également :)
 
Nouveau WRInaute
En effet pour être plus précise, si je suis française au US, que je clik sur français (lang=fr), je rentre dans la condition qui dit que lang=US n’apparait pas dans l'url et je serais donc automatiquement reconduite vers lang=US. (autrement dit au US je n'aurais accès qu'a lang=US, en Espagne à lang=ES...)

Je tiens de plus à préciser, qu'une fois que la langue à été choisie, le paramètre de langue n’apparait plus systématiquement dans les URL des pages internes de navigation.
exemple:
- je suis sur ma Home page, je sélectionne Italie, je vais avoir: www.MonSite.com/?lang=it
- Une fois sur le menu italien je sélectionne un articles: www.MonSite.com/TitreDeMonArticle --> je n'ai plus de paramètre de langue.

Ce n'est pas moi qui ai conçu ce site, je dois simplement rediriger le visiteur en fonction de son pays (mais le visiteur doit bien entendu pouvoir choisir une langue qui soit différente de celle du pays dans lequel il se trouve ).

Voila, j’espère avoir été un petit peu plus claire.... Merci pour votre aide!
Et très bonne journée!!! :D
 
WRInaute discret
Ah oui en effet, il y a un gros soucis de mise en place pour ce système :D

Du coup, impossible de passer par un htaccess pour faire ce boulot :?

Néanmoins, c'est possible dans le code de l'index directement, mais il faut que je sois certains d'une chose:
Si tu n'es plus sur la page d'accueil, peux-tu de nouveau sélectionner une langue ? Si oui, le "?lang=xx" est il postfixé à l'url courante ou bien es-tu redirigé vers l'index "/?lang=xx" ?
 
Nouveau WRInaute
Giustino a dit:
Ah oui en effet, il y a un gros soucis de mise en place pour ce système :D
Du coup, impossible de passer par un htaccess pour faire ce boulot :?

Zuut!!!!!

Giustino a dit:
Néanmoins, c'est possible dans le code de l'index directement, mais il faut que je sois certains d'une chose:
Si tu n'es plus sur la page d'accueil, peux-tu de nouveau sélectionner une langue ? Si oui, le "?lang=xx" est il postfixé à l'url courante ou bien es-tu redirigé vers l'index "/?lang=xx" ?

Quand je ne suis plus sur la page d'accueil, je peux de nouveau sélectionner une langue, la barre de langue est disponible sur toutes les pages du site.

Toutes fois j'ai 2 type de sites:

Au clik sur une langue différente de celle en cours:

1) le premier va ajouter le paramètre de langue dans l'url ce qui va me donner accès au menu de la nouvelle langue choisie.
ex: MonSite.com/monArticleEnAnglais/?lang=IT

2) Le deuxième va me reconduire sur la home page de la langue sélectionnée sous cette forme
ex: MonSite.com/IT/?lang=IT

J'ai donc 2 fonctionnements quelques peu différents.

J’espère que tu m'a comprise...
Merci beaucoup beaucoup!!!! :)
 
WRInaute passionné
Est-ce que tu ne peux pas rajouter justement la condition (pas testé) comme quoi il ne doit avoir mis aucune langue :
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US [NC]
RewriteCond %{QUERY_STRING} !^lang=$ [NC]
RewriteRule ^$ /?lang=us [L,R=301]

Ca fait que ca ne redirigera les ip US que s'il n'y a aucune lang= sélectionnée.

A savoir que tu peux aussi lire les cookies dans le htaccess, vu que j'imagine que c'est comme ca que ton site peut se passer de ?lang=XX par la suite de la visite, non?

RewriteCond %{HTTP_COOKIE} !^lang=us$ [NC]
 
Nouveau WRInaute
FortTrafic a dit:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US [NC]
RewriteCond %{QUERY_STRING} !^lang=$ [NC]
RewriteRule ^$ /?lang=us [L,R=301]

J'ai effectivement testé cet solution qui ne fonctionne pas du fait que mes URL ne contiennent pas forcement le paramètre langue. je serais donc reconduite vers lang=US dans tout les cas!

FortTrafic a dit:
peux aussi lire les cookies dans le htaccess, vu que j'imagine que c'est comme ca que ton site peut se passer de ?lang=XX par la suite de la visite, non?
RewriteCond %{HTTP_COOKIE} !^lang=us$ [NC]

Par contre l'idée du cookies peut être bonne!!! il faudrait que la condition soit que la variable lang=xx soit définie, (quelque soit sa définition (US FR IT ES...))

RewriteCond %{HTTP_COOKIE} !^lang=$ [NC]

je vais essayer ça.
Panse tu que la syntaxe soit correcte?
 
WRInaute passionné
Pour la syntaxe je ne sais pas, sans doute qu'il faudrait mettre une expression, à voir, du style (ou autre chose)

RewriteCond %{HTTP_COOKIE} !^lang=([a-z]+)$ [NC]

Il faut quand même garder la condition pour l'url en plus du cookie, parce que le htaccess est executé avant la page php qui créé le cookie, sinon il risque de toujours etre créé à lang=us la première fois a cause de la redirection :)
Mais bon c'est vrai que c'est dans un cas particulier : quand un visiteur IP US sans cookie qui arrive sur une page avec ?lang=fr si tu ne testes pas l'url mais que le cookie alors il sera redirigé.
C'est vrai que c'est un cas particulier qui peut être ignoré :)
 
WRInaute discret
Je suis désolé je pense que j'avais mal compris ton système en fait.
Du coup, si tu utilises les cookies pour sauvegarder la langue courante de l'utilisateur, alors oui c'est faisable.

Néanmoins, on est bien d'accord que ton code ne s'applique qu'à la "root" page ? Car si tu veux qu'elle s'applique partout (voir ta description des liens possibles), alors il faudra également adapter.

Sinon, en partant du principe que tu crées un cookie "lang" avec une valeur de 2 lettre minuscules décrivant la langue, tu pourrais utiliser la technique citée plus haut:

Code:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US [NC]
RewriteCond %{HTTP_COOKIE} !lang=[a-z]{2} [NC]
RewriteRule ^$ /?lang=us [L,R=301]

Scénario:
cas 1) L'utilisateur arrive pour la première fois (j'entends par là qu'il n'a pas/plus de cookie "lang" actif) sur la "root" page. S'il est de la zone "US" alors il est redirigé vers /?lang=us. Ensuite, pas d'autres redirections car maintenant ton cookie doit exister (tu dois le créer ou le modifier à chaque fois que tu reçois une query string "lang" dans ton url).
cas 2) L'utilisateur revient plus tard sur la "root" page, et est de la zone "US" (ce dernier point importe peu). Mais il possède déjà le cookie "lang" et n'est donc pas redirigé. S'il clique sur une autre langue, à toi de modifier le cookie en conséquence.
 
Nouveau WRInaute
Bonjour Bonjour!!!

Je reviens vers vous car mon problème n'est toujours pas résolue....

En réalité j'ai vérifié et il n'y a pas de cookies pour retenir la langue du navigateur, c'est tout simplement qu'au clik sur une certaine langue le menu apparaît dans cette langue ce qui permet donc d'avoir accès au contenu dans la langue choisie.
le paramètre langue n’apparaît donc dans l'url qu'au moment du choix de la langue.

n'y aurait il donc pas un moyen de dire qu une fois l'url réécrite il ne la réécrit plus durant toute la session?

j 'ai même penser peux être passer par une fonction php tout simplement? qu'en pensez vous?

Merci beaucoup!!!!!! bonne fin de journée!
 
Nouveau WRInaute
Bonjour, 

J'ai essayer 2 solutions hier, qui devrait théoriquement marcher mais... ça ne fonctionne pas!

Solution1
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^FR   //si IP Francais
RewriteCond %{REQUEST_URI} !(^.$)    // et qu'il n'y a pas de paramettre dans l'URL 
RewriteRule ^$  /?lang=fr [L,R=301]   //Reconduire sur lang=fr

Solution2
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^FR   //si IP Francais
RewriteRule \.info$  /?lang=fr [L,R=301]   //Reconduire, que la home page, vers lang=fr

Je ne comprend pas pourquoi ces méthodes ne fonctionnent pas? y a t'il des erreurs de syntaxes?

Merci d'avance pour vos réponses!!!
 
WRInaute discret
smit a dit:
En réalité j'ai vérifié et il n'y a pas de cookies pour retenir la langue du navigateur, c'est tout simplement qu'au clik sur une certaine langue le menu apparaît dans cette langue ce qui permet donc d'avoir accès au contenu dans la langue choisie.
le paramètre langue n’apparaît donc dans l'url qu'au moment du choix de la langue.

J'ai du mal à comprendre la façon dont fonctionne ce système. Pas de cookie me faisait donc penser que la langue était sauvegardée dans une session utilisateur, mais en lisant ceci j'ai des doutes. Pouvez-vous m'envoyer le lien de votre site en message privé afin de voir comment il fonctionne et ainsi avoir une idée plus précise ?

smit a dit:
n'y aurait il donc pas un moyen de dire qu une fois l'url réécrite il ne la réécrit plus durant toute la session?

j 'ai même penser peux être passer par une fonction php tout simplement? qu'en pensez vous?

En effet, le faire en php serait une bonne idée, mais cela dépend encore une fois de ce qui vient d'être dit juste avant.

smit a dit:
Solution1
Code:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^FR   //si IP Francais
RewriteCond %{REQUEST_URI} !(^.$)    // et qu'il n'y a pas de paramettre dans l'URL 
RewriteRule ^$  /?lang=fr [L,R=301]   //Reconduire sur lang=fr

Solution2
Code:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^FR   //si IP Francais
RewriteRule \.info$  /?lang=fr [L,R=301]   //Reconduire, que la home page, vers lang=fr

Cela revient à mon premier message, c'est-à-dire

Code:
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US [NC]
RewriteCond %{QUERY_STRING} !^lang=us$ [NC]
RewriteRule ^$ /?lang=us [L,R=301]

Mais ce n'était pas faisable (voir votre réponse et la discussion qui s'en suit).
 
Nouveau WRInaute
Merci beaucoup pour la réponse!

Toute fois, la différence avec les solutions que j'ai proposé et ce que vous m'avez fait parvenir, est que ce n'est pas que le paramètre lang qui ne doit pas apparaître, mais que l'url ne contienne aucun paramètres, ce qui revient (solution 2) à dire que seul la home page doit être reconduite! (puisque si je ne suis pas dans la home page, j ai des paramètres dans l'url.)
 
Nouveau WRInaute
Hello
Je me permet d'essayer de donner un coup de main.
Je pense que préciser explicitement le country code dans la chaine de requete ?lang=XX fait la boucle de redirection, c'est implicitement precisé avec la regle du dessus {ENV:GEOIP_COUNTRY_CODE}
Essayes ca :

Code:
#si l'ip est ricaine ou le reste du monde a lexeption des pays ci dessous
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US [NC,OR]
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(FR|BE|CH|IT|ES) [NC]
#si la chaine de requete est absente
RewriteCond %{QUERY_STRING} !^lang=(fr|us|es|be|ch|it)$ [NC]
#et que c'est la page d'accueil (sans chaine de requête du coup)
RewriteCond %{REQUEST_URI} ^/$ [NC]
#on redirige le tout vers la page d'accueil avec la chaine de requete us
RewriteRule ^(.*)$ /?lang=us [L,R=301]

#si l'ip est italienne
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^IT [NC]
#si la chaine de requete est absente
RewriteCond %{QUERY_STRING} !^lang=(fr|us|es|be|ch|it)$ [NC]
#et que c'est la page d'accueil (sans chaine de requête du coup)
RewriteCond %{REQUEST_URI} ^/$ [NC]
#on redirige le tout vers la page d'accueil avec la chaine de requete it
RewriteRule ^(.*)$ /?lang=it [L,R=301]

#si l'ip est espagnole
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^ES [NC]
#si la chaine de requete est absente
RewriteCond %{QUERY_STRING} !^lang=(fr|us|es|be|ch|it)$ [NC]
#et que c'est la page d'accueil (sans chaine de requête du coup)
RewriteCond %{REQUEST_URI} ^/$ [NC]
#on redirige le tout vers la page d'accueil avec la chaine de requete es
RewriteRule ^(.*)$ /?lang=es [L,R=301]


#sinon si c'est francais/belge/suisse
#si l'ip est francaise, belge ou suisse
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(FR|BE|CH) [NC]
#si la chaine de requete est absente
RewriteCond %{QUERY_STRING} !^lang=(fr|us|es|be|ch|it)$ [NC]
#et que c'est la page d'accueil (sans chaine de requête du coup)
RewriteCond %{REQUEST_URI} ^/$ [NC]
#on redirige le tout vers la page d'accueil avec la chaine de requete fr
RewriteRule ^(.*)$ /?lang=fr [L,R=301]
 
Nouveau WRInaute
MERCI MERCI MERCI!!!!!!!

CA MARCHE!!!!!!!!!!!!!!

RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^FR [NC]
RewriteCond %{QUERY_STRING} !^c=(ca|fr|es|uk|de|it)$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteRule ^(.*)$ /fr/?c=fr [L,R=301]

Vous m'avez sauvé!!!!! :D :D :D
 
Nouveau WRInaute
Cool :wink:

Code:
#Je pense néanmoins après réflexion que tu devrais ajouter deux fix.
#pour éviter d'éventuels problèmes

#1
#éviter de rediriger localhost par exemple en cas du code php file_get_content
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1

#2
#attends d'autres avis mais il n'est pas souhaitable je pense de rediriger les bots (googlebot,bingbot)
#vu que l'ip des bots de google est ricaine.....ca va cafouiller.  :mrgreen: 
RewriteCond %{HTTP_USER_AGENT} !(googlebot|bingbot|DuckDuckBot|Yahoo|msnbot|Exabot|OrangeBot|exeterabotsympa) [NC]

#3
#surveilles bien error.log et access.log, ajoutes des fix si besoin
 
Discussions similaires
Haut