レスポンス Cookie の取り扱いについて

VCL でレスポンス Cookie を読み取る従来の方法では、beresp.http.Set-Cookie または resp.http.Set-Cookie の変数を調べ、正規表現を使用して値が抽出されます。しかし、複雑な文字列や引用符付きの文字列を正規表現で解析するのは不安定で、エッジケースによって失敗しやすいため、これは理想的な方法ではありません。また、オリジンが複数の Set-Cookieヘッダーを送信する場合のように、同じ名前を持つ複数のヘッダーを読み取ることができません。これら2つの理由から、Fastly では Set-Cookie ヘッダーの数にかかわらず、これらのヘッダーから名前付きの値を抽出する方法をサポートしています。

名前付きの値にアクセスするには、リクエストのどの部分かに応じて、beresp または resp を持つ関数を使用します。

1
setcookie.get_value_by_name(beresp, "name")

または

1
setcookie.get_value_by_name(resp, "name")

"name" は値の名前に置き換えます。例えば、以下のようなオリジンからの HTTP レスポンスがあるとします。

1
2
3
4
5
6
7
8
9
10
HTTP/1.1 200 OK
Cache-Control: max-age=60
Content-Type: text/html; charset=utf-8
Content-Length: 80806
Accept-Ranges: bytes
Date: Tue, 11 Aug 2015 19:00:04 GMT
Age: 123
Connection: keep-alive
Set-Cookie: one=a; httponly; secure
Set-Cookie: two=b or not to b; httponly

そこで、以下のような関数を使用します。

1
2
set resp.http.X-One = setcookie.get_value_by_name(resp, "one");
set resp.http.X-Two = setcookie.get_value_by_name(resp, "two");

resp.http.X-One が「a」に、resp.http.X-Two が「b or not to b」に設定されます。

このロジックは、カスタム VCL のアップロードや、コントロールパネルを通じて使用することができます。例:

コントロールパネルを使用してヘッダー経由で設定されたレスポンス Cookie ロジックの例

Back to Top