0

次のページで、アプリケーションがユーザーへの「アラートメッセージ」を保持するCookieを設定したかどうかを検出しようとしています。検出された場合、Javascriptはそれを表示します。

私のvcl_fetch()では、特定のCookie値「alert_message」がSet-Cookieヘッダー(おそらくVCL変数beresp.http.Set-Cookie)のどこかに表示されるかどうかを検出する必要があります。検出された場合、その次のページをキャッシュしたくありません(VarnishはデフォルトでSet-Cookieヘッダーを削除するため、ブラウザーに戻る前にアラートメッセージが消去されます)。

だからここに私の簡単なテストがあります:

if(beresp.http.Set-Cookie ~ "alert_message") {
    set req.http.no_cache = 1;
}

不思議なことに、それは真と評価されません。

そこで、変数をサーバーヘッダーにスローして、どのように表示されるかを確認します。

set beresp.http.Server = " MyApp Varnish implementation - test reading set-cookie: "+beresp.http.Set-Cookie;

しかし、何らかの理由で、これは応答ヘッダーの最初のSet-Cookie行のみを表示します。

関連する応答ヘッダーは次のとおりです。

Server: MyApp Varnish implementation - test reading cookie: elstats_session=7d7279kjmsnkel31lre3s0vu24; expires=Wed, 10-Oct-2012 00:03:32 GMT; path=/; HttpOnly
Set-Cookie:app_session=7d7279kjmsnkel31lre3s0vu24; expires=Wed, 10-Oct-2012 00:03:32 GMT; path=/; HttpOnly
Set-Cookie:alert_message=Too+many+results.; expires=Tue, 09-Oct-2012 20:13:32 GMT; path=/; domain=.my.app.com
Set-Cookie:alert_key=flash_error; expires=Tue, 09-Oct-2012 20:13:32 GMT; path=/; domain=.my.app.com
Vary:Accept-Encoding

すべてのSet-Cookieヘッダー行で文字列検出を読み取って実行するにはどうすればよいですか?

4

1 に答える 1

2

vmod ヘッダーの header.get 関数で解決できます(Varnish バージョン >= 3)

たとえば、単純な PHP スクリプトとその中に複数の Set-Cookie があります。

 <?php
 setcookie ("Foo", "test", time() + 3600);
 setcookie ("Bar", "test", time() + 3600);
 setcookie ("TestCookie", "test", time() + 3600);
 ?>

デフォルトでは、最初の Set-Cookie ヘッダーのみが「 if(beresp.http.Set-Cookie ~ "somedata" 」で解析されます。もちろん、vmod stdから std.collect プロシージャを使用できます(すでに Varnish 3 に付属しており、すべての Set-Cookie ヘッダーを 1 つに折りたたむにはコンパイルが必要ですが、Cookie が壊れます - Bar と TestCookie は設定されません。

header.get はこの欠陥を回避します: 正規表現の一致についてすべてのヘッダーをチェックします:

 if (header.get(beresp.http.set-cookie,"TestCookie=") ~ "TestCookie")
 {
     set beresp.http.cookie-test = 1;
     return(hit_for_pass);
 }

それで、最初と次のリクエストでレスポンスヘッダーを取得しました:

cookie-test:1
Set-Cookie:Foo=test; expires=Tue, 09-Oct-2012 22:33:37 GMT
Set-Cookie:Bar=test; expires=Tue, 09-Oct-2012 22:33:37 GMT
Set-Cookie:TestCookie=test; expires=Tue, 09-Oct-2012 22:33:37 GMT
X-Cache:MISS

Cookie TestCookie の setcookie をコメントアウトすると、次のリクエストで HIT が発生します。

于 2012-10-09T21:35:36.653 に答える