Accept-Language ヘッダーの VCL 機能
最終更新日 2018-05-11
Fastly では Accept-Language
ヘッダーを解析・正規化する関数など、多数の VCL の拡張機能が利用可能です。
言語のルックアップ
Lookup 機能は RFC 4647 セクション 3.4の定義に準拠して実装されています。
シンタックス
accept.language_lookup(<available languages>, <default>, <priority list>)
引数 | 説明 |
---|---|
available languages |
コロンで区切られた選択対象の言語リスト。通常はオリジンが提供可能な言語になります。例: en:de:fr:pt:es:zh-CN |
default |
priority list の中にマッチするものがない場合に返すデフォルトの言語。例: en |
priority list |
Accept-Language ヘッダー。カンマで区切られた言語のリスト。オプションで q 値による重み付けが可能です。例: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 |
戻り値
RFC に従って最もマッチした言語が返されます。マッチがなければ、デフォルトの言語が返されます。ただし、優先順位リストで重みがゼロ (q=0
) であることが示された場合は、NULL
が返されます。
例
1
2
set req.http.Normalized-Language =
accept.language_lookup("en:de:fr:pt:es:zh-CN", "en", req.http.Accept-Language);
上の例では、Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
ヘッダーに対して Normalized-Language: pt
を返します。
accept.language_lookup("en", "nl", "en-GB")
の場合、タグがマッチしない場合は各サブタグが削除され、マッチが再試行されるため、en
が返されます。
accept.language_lookup("en:nl", "nl", "en-GB,nl;q=0.5")
の場合は nl
がより正確にマッチしていても、nl の q 値がより低いことが優先されるため、en
が返されます。正確さは無関係であることを意味します。
accept.language_lookup("en-US:nl", "nl", "en-GB,nl;q=0.5")
の場合、サブタグは利用可能な言語からは削除されず、優先リストの言語タグからのみ削除されるため、nl
が返されます。
accept.language_lookup("en-US:nl", "nl", "en-us,nl;q=0.5")
の場合、ルックアップは大文字小文字を区別しないため、en-US
が返されます。
accept.language_lookup("en-US:nl", "nl", "en-GB,nl;q=0")
の場合、en-GB
と en
がマッチせず、nl
(デフォルト) は許容不可としてリストされているため、NULL
(文字列ではなく値) が返されます。
デフォルトの言語の q=0
が無視される場合は、次の VCL を使用できます。
1
2
3
4
5
6
7
set req.http.Normalized-Language =
accept.language_lookup("en-US:nl", "nl", req.http.Accept-Language);
if (!req.http.Normalized-Language) {
# User will get Dutch even if he doesn't want it!
# (Because none of our languages were acceptable)
set req.http.Normalized-Language = "nl";
}
言語フィルター (Basic)
Fastly は RFC 4647 のセクション 3.3.1の定義に準拠する Basic Filtering 機能を実装しました。ワイルドカードタグ (*
) を使用した場合の実装は正確ではありません。ワイルドカードが検出され、マッチするものがない場合は、デフォルトが返されます。マッチするものがあれば、それが返され、優先順位リストの残りの部分は無視されます。
Extended Filtering は実装されていませんが、必要の際はいつでもサポートに機能をリクエストすることができます。
シンタックス
accept.language_filter_basic(<available languages>, <default>, <priority list>, <limit>)
引数 | 説明 |
---|---|
available languages |
コロンで区切られた選択対象の言語リスト。通常はオリジンが提供可能な言語になります。例: en:de:fr:pt:es:zh-CN |
default |
priority list の中にマッチするものがない場合に返すデフォルトの言語。例: en |
priority list |
Accept-Language ヘッダー。カンマで区切られた言語のリスト。オプションで q 値による重み付けが可能です。例: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 |
limit |
返される最大言語数。 |
戻り値
RFC に従って最もマッチした言語が返されます。マッチがなければ、デフォルトの言語が返されます。ただし、優先順位リストで重みがゼロ (q=0
) であることが示された場合は、NULL
が返されます。
例
1
2
set req.http.Filtered-Language =
accept.language_filter_basic("en:de:fr:pt:es:zh-CN", "en", req.http.Accept-Language, 2);
上の例では、Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
ヘッダーに対して Filtered-Language: pt,en
を返します。
accept.language_filter_basic("en", "nl", "en-GB", 2)
の場合、タグがマッチしない場合は各サブタグが削除され、マッチが再試行されるため、en
が返されます。
accept.language_filter_basic("en:nl", "nl", "en-GB,nl;q=0.5", 2)
の場合、nl
がより正確にマッチしていても、nl の q 値が低いことが優先されるので、en,nl
が返されます。正確さは無関係であることを意味します。
accept.language_filter_basic("en-US:nl", "nl", "en-GB,nl;q=0.5", 2)
の場合、検索中に使用可能な言語からサブタグが削除されないため、nl
が返されます。
accept.language_filter_basic("en-US:nl", "nl", "en-us,nl;q=0.5", 2)
の場合、ルックアップは大文字小文字を区別しないため、en-US,nl
が返されます。
accept.language_filter_basic("en-US:nl", "nl", "en-GB,nl;q=0", 2)
の場合、en-GB
と en
がマッチせず、nl
(デフォルト) は許容不可としてリストされているため、NULL
(文字列ではなく値) が返されます。
デフォルトの言語の q=0
が無視される場合は、次の VCL が有効です。
1
2
3
4
5
6
7
set req.http.Filtered-Language =
accept.language_filter_basic("en-US:nl", "nl", req.http.Accept-Language, 2);
if (!req.http.Filtered-Language) {
# User will get Dutch even if he doesn't want it!
# (Because none of our languages were acceptable)
set req.http.Filtered-Language = "nl";
}
accept.language_filter_basic("en:nl:de:fr", "nl", "en-GB,*;q=0.5", 2)
は en
を返し、accept.language_filter_basic("en:nl:de:fr", "nl", "*", 2)
は nl
を 返します。