web-dev-qa-db-ja.com

.htaccessを使用してプレーンHTMLファイルのタイプマップファイルとの言語ネゴシエーション用にSEOフレンドリーURLに書き換えます

ウェブサイトwww.example.com/にアクセスする場合、訪問者は正しい言語バージョンにリダイレクトされる必要があります。英語の場合はwww.example.com/en、スペイン語の場合はwww.example.com/es。

現在の実装は、www.example.com/index.varにアクセスしてwww.example.com/index.enにリダイレクトする場合にのみ機能します。これをwww.example.com/en/に書き換えたい

私の実装は 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

重要:MultiViewsは無効になっています

あなたの素晴らしいソリューションを楽しみにしています。


これについてもう少し詳しく説明します...
これは私のファイル構造の例です。

ファイルを書き換えるか、リダイレクトする必要があります。
-index.var-> /
-index.en.html-> /en/
-index。 es.html-> /es/
-about.var-> /about
-about.en.html-> /en/about
-about.es .html-> /es/about
-images/img_1.jpg-> /images/img_1.jpg
-images/logo.var-> /images/logo.png(ファイルではありません)
-images/logo.en.png-> /en/images/logo.png
-images/logo.es.png->/es/images/logo .png 

画像およびその他のリソースの書き換えはオプションです。 htmlファイルの書き換えを正しく行うことのみが重要です

Apacheドキュメントは、これの実例です(コンテンツネゴシエーションを使用)。

4
x21

ApacheのSVNリポジトリで解決策を見つけたと思います。 (まだテストしていません)

多言語サイトの構成
多言語エラーページの設定
言語とエンコーディングの設定を使用した構成

ここでの実装では、タイプマップファイルに.varではなく.html拡張子を使用しています。つまり、.html.enの代わりに拡張子.htmlを持つhtmlファイルを使用する場合は、置き換える必要があります

AddHandler type-map .html

AddHandler type-map .var

私がしたように。

1
x21

これはPHPで行うだけです。 htaccessでそれを行う方法がわかりません。

私は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;
}
?>

または、リダイレクトが必要な場合は、次を実行できます。

    <?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