IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

URL Rewriting pour site multi-langue (?lang=fr|en)


Sujet :

Apache

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 9
    Points : 6
    Points
    6
    Par défaut URL Rewriting pour site multi-langue (?lang=fr|en)
    Bonjour,


    J'ai un site internet avec une variable GET lang sur toutes mes pages.


    Pour changer la langue, c'est simple, je met soit ?lang=fr soit ?lang=en.

    Par contre, pour que ce soit plus propre, et surtout pour que les liens hypertexte conserve la langue (la variable GET) sans devoir faire quoique ce soit dans le code, il faut faire croire que le site se trouve dans un dossier. Comme ça, avec un chemin relatif, la langue est conservée sur toutes les pages.


    Du coup, c'est fait pas mal de recherche, et j'ai déjà ça, et ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule ^(fr|en)/(.*).php$ $2.php?lang=$1 [L,QSA]
    J'ai ensuite ajouté ceci (pour que l'index.php soit prit en charge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule ^(fr|en)/$ index.php?lang=$1 [L,QSA]
    Est-ce qu'il y a un meilleur moyen de procéder pour ça ?

    Ensuite, c'est là que commence mes problèmes...

    Je veux que l'on puisse accéder au site comme ceci : http://localhost/fr/ (fr ou en, avec un slash à la fin).
    Mais pas comme ceci http://localhost/fr (sans slash).
    Si il n'y à pas de slash, je veux que ça redirige avec le slash.

    J'ai pensé à un truc comme ça, mais je pense que c'est pas le top :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule ^(fr|en)$ http://%{HTTP_HOST}/$1/ [R=301,QSA]
    Qu'en dites-vous ?

    Ensuite, pour finir, et là, c'est mon plus gros problème : comment faire pour bloquer l'accès au site sans /fr/ ou /en/ dans l'URL ?
    J'ai pensé à un truc comme ça, mais ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteRule ^/?$ http://%{HTTP_HOST}/fr/ [R=301,QSA]
    RewriteRule ^/(a-zA-Z0A-9).php$ http://%{HTTP_HOST}/fr/$1.php [R=301,QSA]
    J'aimerais que si on accède au site sans la variable dans l'URL (/fr/ ou /en/), que ça redirige vers le /fr/ par défaut).



    Voici mon fichier total actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Options +FollowSymlinks
    RewriteEngine on
     
    # Détection de la langue pour toutes les pages
    RewriteRule ^(fr|en)/(.*).php$ $2.php?lang=$1 [L,QSA]
    # Détection de la lanque pour index.php (si non présisée dans l'URL)
    RewriteRule ^(fr|en)/$ index.php?lang=$1 [L,QSA]
     
    # Interdiction (avec redirection) d'accès sans le slash final
    RewriteRule ^(fr|en)$ http://%{HTTP_HOST}/$1/ [R=301,QSA]
     
    # Interdiction (avec redirection) d'accès au site sans langue (variable)
    RewriteRule ^/?$ http://%{HTTP_HOST}/fr/ [R=301,QSA]
    RewriteRule ^/(a-zA-Z0A-9).php$ http://%{HTTP_HOST}/fr/$1.php [R=301,QSA]
    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé Avatar de 01001111
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 319
    Points : 509
    Points
    509
    Par défaut
    Bonjour Blabla72
    Pour les premières regex ça m'a l'air ok hormis le L, pour la redirection d'un non fr|en, tu peux utiliser le point d'exclamation en prefix pour "nier" une regexp.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RewriteRule !(fr|en)/?$ http://%{HTTP_HOST}/fr/ [R=301,QSA]
    Attention L en flag arrête le parcours des règles si une règle efficace est trouvée. Donc à éviter apparemment ici.
    voici un lien vers les descriptions des flags de mod_rewrite:
    http://httpd.apache.org/docs/2.2/rewrite/flags.html

    note: une erreur soit dans ta saisie soit dans ta règle:
    la regexp [a-zA-Z0A-9] doit s'écrire [a-zA-Z0-9]

    Mais ceci dit en faisant tout ça, je pense qu'il reste un problème au niveau de la conception de ton modèle, car j'ai peur que tu rencontres assez vite un problème de boucle de redirection.
    En effet si tu rediriges /fr/ sur index.php?lang=fr pour l'éxécution, et que tu veux rechanger sur /fr/ après, ça va peut-être boucler (je dis ça sans être vraiment connaisseur de mod_rewrite)
    0x4F

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Il y a effectivement un problème de boucle, et là, je vous avoue que je ne sais pas du tout comment procéder...
    Un petit coup de pouce ?

    Voici mon fichier actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Options +FollowSymlinks
    RewriteEngine on
     
    # Détection de la langue pour toutes les pages
    RewriteRule ^(fr|en)/(.*).php$ $2.php?lang=$1 [QSA]
    # Détection de la lanque pour index.php si non présisée dans l'URL
    RewriteRule ^(fr|en)/$ index.php?lang=$1 [QSA]
     
    # Interdiction (avec redirection) d'accès sans le slash final
    RewriteRule ^(fr|en)$ http://%{HTTP_HOST}/$1/ [R=301,QSA]
     
    # Interdiction (avec redirection) d'accès au site sans langue (variable)
    RewriteRule ^/?$ http://%{HTTP_HOST}/fr [R=301,QSA]
    RewriteRule ([a-zA-Z0-9]).php$ http://%{HTTP_HOST}/fr/$1.php [R=301,QSA]

  4. #4
    Membre confirmé Avatar de 01001111
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 319
    Points : 509
    Points
    509
    Par défaut
    Je viens d'essayer en local quelques règles, mais Mamp pour Mac a un bug avec la mise à jour du .htaccess on dirait,
    enfin voici ce que je vous conseillerais, je ne sais pas ce que ça vaut, enfin...

    Tout d'abord il faut que vous compreniez que l'url rewriting ne peut marcher que dans un sens, c'est à dire rediriger un masque d'url vers une vraie url serveur.
    Il faut aussi comprendre que toutes les urls doivent être renseignées dans le site selon ce masque, non selon l'écriture réelle.
    Enfin, on peut ajouter qu'une autre technique consiste à capturer les urls pour rediriger vers la racine du serveur dans le cas d'un visionnage non par les robots mais par un humain et par la suite de générer une url équivalente via javascript avec history.pushState ou history.replaceState.

    voici un exemple de script php qui capture le get:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ini_set('session.gc_maxlifetime', 3600);
    @session_cache_expire(60);
    @session_start();
    $url=$_SERVER['REQUEST_URI'];
    $uA=$_SERVER['HTTP_USER_AGENT'];
    $patternCrawler='/bot|spider|crawler|yahoo|search|meta|snif|facebook|https:\/\/developers\.google\.com\//i';
    if ((preg_match('/index.php/i', $url) || preg_match('/\?/', $url)) && !preg_match($patternCrawler, $uA)) {
    	$url=preg_replace('/index.php/i', '', $url);
    	if (preg_match('/([^\?]*)\?([^\?]+)/i', $url)) {
    		$get=preg_replace('/([^\?]*)\?([^\?]+)/i', '$2', $url);
    		$_SESSION['get']=$get;
    		$pathinfo=preg_replace('/([^\?]*)\?([^\?]+)/i', "$1", $url);
    		header('Location: http://'.$_SERVER['HTTP_HOST'].$pathinfo);
    	}
    } else if ((!preg_match('/index.php/i', $url) || !preg_match('/\?/', $url)) && !isset($_SESSION['url']) && !preg_match($patternCrawler, $uA)) {
    	header('Location: http://'.$_SERVER['HTTP_HOST'].'?accueil');
    }

    Donc les règles de réécriture se limiteraient à celles-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Options +FollowSymlinks
    RewriteEngine on
    RewriteBase /
    # Rewriting de la langue et de la page quand renseignées
    RewriteRule ^/(fr|en)/(.*)$ $2.php?lang=$1 [QSA]
    # Rewriting en cas d'url racine
    RewriteRule ^/$ index.php?lang=fr [QSA]
    Pour le reste je vous laisse travailler sur le modèle...
    0x4F

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/12/2010, 01h12
  2. URL rewriting pour un générateur de sites (CMS)
    Par vince-nantes dans le forum Apache
    Réponses: 5
    Dernier message: 25/03/2010, 11h28
  3. Meilleures pratiques pour un site multi-langues
    Par Bakura dans le forum Référencement
    Réponses: 6
    Dernier message: 22/01/2010, 19h42
  4. url d'un site multi-langues
    Par maa dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/04/2007, 16h58
  5. Utilisation XML/XSL pour un site multi langues
    Par bigsister dans le forum Balisage (X)HTML et validation W3C
    Réponses: 10
    Dernier message: 22/01/2007, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo