web-dev-qa-db-fra.com

Réécrivez sur des URL conviviales pour le référencement pour la négociation de langue avec des fichiers de type map sur des fichiers HTML simples à l'aide de .htaccess

Lors de la visite du site Web www.example.com/, le visiteur doit être redirigé vers la version linguistique appropriée, par exemple. www.example.com/en pour l'anglais et www.example.com/es pour l'espagnol.

Mon implémentation actuelle ne fonctionne que lors de la visite de www.example.com/index.var et des redirections vers www.example.com/index.fr. Maintenant, je veux réécrire ceci sur www.example.com/fr/

Mon implémentation est basée sur https://httpd.Apache.org/docs/2.4/content-negotiation.html .

.htaccess

Options -MultiViews
RewriteEngine On
RewriteBase /
AddHandler type-map .var
LanguagePriority en es de
ForceLanguagePriority Fallback

index.var

URI: index; vary="language"

URI: index.en.html
Content-type: text/html
Content-language: en

URI: index.es.html
Content-type: text/html;charset=utf-8
Content-language: es

URI: index.de.html
Content-type: text/html;charset=utf-8
Content-language: de

Important: les vues multiples sont désactivées

Dans l'attente de vos bonnes solutions.


pour expliquer cela un peu plus en détail ...
Voici un exemple de la structure de mon fichier:

 Le fichier doit être réécrit ou redirigé vers 
 - index.var -> /
 - index.fr.html -> /en/
 - index. es.html -> /es/
 - about.var -> /about
 - about.en.html -> /fr/about
 - about.es .html -> /es/about
 - images/img_1.jpg -> /images/img_1.jpg
 - images/logo.var -> /images/logo.png ( pas un fichier) 
 - images/logo.fr.png -> /fr/images/logo.png
 - images/logo.es.png ->/es/images/logo .png 

La réécriture des images et autres ressources est facultative. Il est seulement important d’avoir une bonne réécriture des fichiers HTML.

La documentation Apache en est un exemple de travail (en utilisant la négociation de contenu).

4
x21

Je pense avoir trouvé la solution sur le référentiel SVN d'Apache. (Je ne l'ai pas encore testé)

Configuration pour site multilingue
Configuration pour les pages d'erreur multilingues
Configuration avec la configuration des langues et des codages

L'implémentation utilise ici l'extension .html pour les fichiers de type-map au lieu de .var. Cela signifie que si vous voulez utiliser des fichiers HTML avec l’extension .html au lieu de .html.en, vous devez remplacer

AddHandler type-map .html

avec

AddHandler type-map .var

comme j'ai fait.

1
x21

Je voudrais juste faire ceci en PHP. Je ne sais pas comment le faire dans htaccess.

Je voudrais faire index.php:

<?php
header("Status: 200 OK");
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
switch ($lang){
    case "fr":
        //echo "PAGE FR";
        include("index_fr.php");//include check session FR
        break;
    case "it":
        //echo "PAGE IT";
        include("index_it.php");
        break;
    case "en":
        //echo "PAGE EN";
        include("index_en.php");
        break;        
    default:
        //echo "PAGE EN - Setting Default";
        include("index_en.php");//include EN in all other cases of different lang detection
        break;
}
?>

Ou si vous voulez la redirection, vous pouvez faire:

    <?php
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    switch ($lang){
        case "en":
          header('Location: http://www.example.com/en/', true, 302);
    exit;
        case "es":
             header('Location: http://www.example.com/es/', true, 302);
  exit;
        case "de":
            header('Location: http://www.example.com/en/', true, 302);
  exit;       
        default:
            //echo "PAGE EN - Setting Default";
            include("index_en.php");//include EN in all other cases of different lang detection
            break;
    }
    ?>
0
Michael d

J'utiliserais des règles de réécriture pour émettre des redirections permanentes 301:

RewriteEngine on

# First handle the index.XX.html files
# where the language code is moved to the front directory
# and the index and html are removed
RewriteCond %{REQUEST_URI} !^/?([a-z]{2})/
RewriteRule ^/?(.*/)?index\.([a-z]{2})\.html$ /$2/$1 [L,R=301]

# Then handle other file.XX.html files
# where the language code is moved to the front directory
# the file name is preserved, but the html is removed
RewriteCond %{REQUEST_URI} !^/?([a-z]{2})/
RewriteRule ^/?(.*)\.([a-z]{2})\.html$ /$2/$1 [L,R=301]

# Handle all other file.XX.xyz
# where the language code is moved to the front directory
# and the file name and extension are preserved
RewriteCond %{REQUEST_URI} !^/?([a-z]{2})/
RewriteRule ^/?(.*)\.([a-z]{2})\.([a-z]+)$ /$2/$1.$3 [L,R=301]

Ceci détecte un code de langue à deux caractères en utilisant l'expression régulière ([a-z]{2}). Vous pouvez plutôt utiliser quelque chose comme (en|es|de) avec une liste spécifique des langues prises en charge. Cela pourrait réduire les erreurs basées sur des codes à deux chiffres utilisés pour autre chose que la langue (comme par exemple un fichier javascript gzippé: .js.gz.). Cela vous permettrait également d'élargir les règles pour inclure les informations de pays si nécessaire (comme en-us.)

Toutes les règles ont un RewriteCond qui garantit qu'elles ne s'appliquent pas dans les sous-répertoires de la langue. Cela devrait aider à prévenir des boucles infinies ou d'autres problèmes

Les règles commencent par /?, qui utilise une barre oblique de sorte que les règles puissent être utilisées dans . Htaccess ou dans un fichier Apache . Conf.

La première règle rend le chemin du répertoire précédant index facultatif à l'aide d'un point d'interrogation dans la section (.*/)?. Cela permet que cette règle s'applique aux fichiers racine index.XX.html.

Je n'ai pas défini de règle pour les fichiers .var, car il semble que vous ayez déjà quelque chose en place pour eux. Vous devez continuer à gérer ces fichiers comme vous le faites maintenant.

J'ai testé ces règles sur mon serveur Apache local en les mettant dans . Htaccess et en consultant le site avec curl. Ils semblent faire la bonne chose:

$ curl -s --head 'http://example.com/index.en.html'
HTTP/1.1 301 Moved Permanently
Location: http://example.com/en/

$ curl -s --head 'http://example.com/index.es.html'
HTTP/1.1 301 Moved Permanently
Location: http://example.com/es/

$ curl -s --head 'http://example.com/about.en.html'
HTTP/1.1 301 Moved Permanently
Location: http://example.com/en/about

$ curl -s --head 'http://example.com/about.es.html'
HTTP/1.1 301 Moved Permanently
Location: http://example.com/es/about

$ curl -s --head 'http://example.com/images/logo.en.png'
HTTP/1.1 301 Moved Permanently
Location: http://example.com/en/images/logo.png

$ curl -s --head 'http://example.com/images/logo.es.png'
HTTP/1.1 301 Moved Permanently
Location: http://example.com/es/images/logo.png
0
Stephen Ostermiller