web-dev-qa-db-ja.com

.htaccessを使用して、優先言語(Accept-Language)に応じてリダイレクトします

ユーザーが/をリクエストするとき、HTTPリクエストヘッダーで指定された設定に応じて、/enまたは/deにリダイレクトしたいと思います Accept-Language

これはサーバーサイドスクリプトで簡単だと思いますが、静的サイトで機能する必要があるため、.htaccessソリューションが必要です。

私が試したこと:

  • mod_negotiation (タイプマップまたはMultiViewsオプションのいずれかを使用):

    ユーザーは好みの言語を取得しますが、しかしリダイレクトされません。

  • mod_rewriteRewriteCond %{HTTP:Accept-Language}):

    ユーザーはリダイレクトされますが、しかしユーザーは(必然的に‡)好みの言語を取得しません。

    (‡言語の品質値が0より大きいことを保証するものでも、両方の言語が異なる品質値で指定されている場合に優先言語を検出するものでもありません。)

これに対する解決策はありますか?

コンテンツネゴシエーションを何らかの方法でリダイレクトするか、RewriteCondディレクティブで品質値をチェック/比較できるようにするか、またはまったく異なるものか。

4
unor

いくつかの考え:

サーバー構成にアクセスできる場合は、次の方法があります。サーバー構成で RewriteMap ディレクティブを使用します。

次に、_Accept-Language_ヘッダーをPerlまたはその他のスクリプトに送信できます。これにより、RewriteRuleで301を使用して使用できる優先言語が返送されます。

phpのような言語にアクセスできる場合は、「_/_」のindex.phpファイルを使用して、関数header('Location: /en/static-pages.html')でリダイレクトを送信できます。 php 5.3からは、ヘッダーから優先ロケールを返す関数locale_accept_from_http()もあります。

しかし重要です:ユーザーに_"get their preferred language"_をしてもらいたいのです。このテクニックにより、ユーザーは好みの言語を使用できるようになりますか?非常に多くの人がブラウザの設定でこれを設定していません。自動言語選択は、ユーザーの選択の記憶(cookie)と組み合わせる必要があり(必須?)、ユーザーの選択は自動選択よりも優先する必要があります(必須?)。

1
Zimmi

免責事項:私はこれをテストしていません。私は過去にこのタイプのロジックに似たようなものを使用し、mod_aliasを使用して変数を設定し、mod_rewriteに複数の条件を処理させました。これは、Apache2.4のIfステートメントで簡単になります。

RewriteEngine On
SetEnvIf Request_URI ^/$            toplevel
SetEnvIf Accept-Language 'fr'       lang_french
RewriteCond %{ENV:toplevel}         1
RewriteCond %{ENV:lang_french}      1
RewriteRule ^   /fr [R=302,L]

この例では、.htaccessではなくApache構成を使用していることを追加する必要があります。 .htaccessのmod_rewriteに関していくつかの警告があったことを覚えていますが、レイテンシーのペナルティのために使用することはありません。幸運を!

0
Aaron