次の基準に基づいて選択されたさまざまな言語で利用できる小さなサイトがあります (優先順位の昇順)。
Accept-Language
ブラウザから送信された- 優先言語を指定する Cookie
- 最後に言語設定を含むリクエスト パス
サイト自体は静的な HTML ページのみで構成されており、可能な限りそのままにしておきたいと考えています。mod_negotiation
、mod_rewrite
および次の.htaccess
ファイル (言語と文字セットの宣言を省略するために短縮されています)を介して言語選択を実装しました。
Options FollowSymLinks MultiViews
DirectoryIndex index
Header set Pragma no-cache
RewriteEngine on
RewriteRule ^([a-zA-Z-]{2,5})$ index [CO=language:$1:.example.com:525600,E=LANG:$1]
SetEnvIf Cookie "language=([a-zA-Z-]+)" COOKIE_LANG=$1
SetEnvIf COOKIE_LANG (.+) prefer-language=$1
SetEnvIf REDIRECT_LANG (.+) prefer-language=$1
# plenty of AddLanguage and AddCharset calls
LanguagePriority en-us
DefaultLanguage en-us
ForceLanguagePriority Prefer Fallback
これは、8 月以降、次のことを可能にするために正常に機能しています。
- Cookie が存在しないため、
Accept-Language
引き継ぎます (のおかげでMultiViews
) - Cookie が存在します。Cookie の言語が使用されます (
prefer-language
) - リクエスト パスは
/es
または類似しており、(a) Cookie を設定し、(b)prefer-language
その値を設定するために使用されます。
現在、私はサイトにさらにいくつかのリソースを持ってMultiViews
い/resource
ます/resource.html
.
/resource/en
ここで、URI 処理を拡張して、特定の言語でリソースを直接選択するようなことができるようにしたいと考えました/
。私は次のことを試しましたRewriteRule
:
RewriteRule ^(([^/]+)/)?([a-zA-Z-]{2,5})$ /$2 [CO=language:$3:.example.com:525600,E=LANG:$3]
正しいリソースが送信され、正しいCookieが設定されている限り機能しますが、優先言語は環境変数から取得されないようです。現在、言語の選択を強制しているのは Cookie だけですが、それは以前と同じ要求であるため、ページを更新するまで新しい言語は表示されません。これまでのところ、ルールで試したことは、その動作に影響を与えませんでした。興味深いことに、このルールを使用しても、上記の古い動作は問題なく機能します。/
奇妙なことをするのとは違う何かを要求した場合にのみです。
これは共有ホスティング (FreeBSD 刑務所内) にあるため、書き換えログを有効にすることはできません (ファイルの物理パスさえわからないため)。さらに、環境変数を無視し、何らかの理由で優先言語を設定するためにのみ Cookie を使用しているように見えます。で、その理由は今のところわかりません。何か助けはありますか?