1

次の基準に基づいて選択されたさまざまな言語で利用できる小さなサイトがあります (優先順位の昇順)。

  1. Accept-Languageブラウザから送信された
  2. 優先言語を指定する Cookie
  3. 最後に言語設定を含むリクエスト パス

サイト自体は静的な HTML ページのみで構成されており、可能な限りそのままにしておきたいと考えています。mod_negotiationmod_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 月以降、次のことを可能にするために正常に機能しています。

  1. Cookie が存在しないため、Accept-Language引き継ぎます (のおかげでMultiViews)
  2. Cookie が存在します。Cookie の言語が使用されます ( prefer-language)
  3. リクエスト パスは/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 を使用しているように見えます。で、その理由は今のところわかりません。何か助けはありますか?

4

1 に答える 1

1

RewriteRuleと の間で言語選択を混合することで、問題を解決しましたSetEnvIf

SetEnvIf Cookie "language=([a-zA-Z-]+)" prefer-language=$1
SetEnvIf REDIRECT_prefer-language "(.+)" prefer-language=$1
SetEnvIf Request_URI "/([a-zA-Z-]{2,5})$" prefer-language=$1

RewriteRule "^(([^/]+)/)?([a-zA-Z-]{2,5})$" /$2 [CO=language:$3:.example.com:525600]

ルールは、Cookie を設定して正しいリソースを指すようになりましたが、言語の選択はリクエスト URI の照合によって処理されます。何かの前にREDIRECT_.

于 2011-11-14T02:22:19.323 に答える