Accept-Language ヘッダーの VCL 機能

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-GBen がマッチせず、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-GBen がマッチせず、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 を 返します。

Back to Top