8

サーバーにコールバックしてCookieを設定する単一のESIインクルードを使用してVarnishを介してロードされている基本的なPHPページがあります。クッキーはドメインアクセスなどで設定されますが、ESIを介して呼び出された場合、クッキーは設定されません。ESIインクルードパスに直接アクセスする場合、Cookieは問題なく設定されます。VCLがCookieを強制終了する可能性があると考えて、Varnish構成を何もキャッシュしないように設定しました。

これ...

<esi:include src="/init.php?<?=http_build_query($_GET); ?>"></esi:include>

...これを含む...

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

setcookie('superman', 'clark kent', 0, '/', '.whatever.com');

?>

私はVarnishとESIを初めて使用するので、これが既知の制限(ESIまたはVarnishのESI実装のいずれか)であるかどうか疑問に思い始めていますが、オンラインで問題の説明を見つけることができません。

4

1 に答える 1

13

以前に質問されたが回答されていない興味深い質問(ESI:includeを介したCookieの設定、方法は?)。私はあなたがこのようにそれをすることができるとは思わない。ESI-includeを使用すると、ESIプロセッサは個別の要求を行い、ヘッダーではなく本文の一部を置き換えます。好みのset-cookie動作を正しく機能させるために、ESI仕様では、すべてのset-cookieヘッダーを「マージ」する方法を指定する必要があります。

ESI仕様の第6章を参照してください:http ://www.w3.org/TR/esi-lang

ESIテンプレートが処理されるとき、検出されたインクルードごとに個別の要求を行う必要があります。実装では、元のリクエストのヘッダー(Cookie、User-Agentなど)を使用する場合があります。さらに、フラグメントからの応答ヘッダー(Set-Cookie、Server、Cache-Control、Last-Modifiedなど)は無視される可能性があり、アセンブルされたページに影響を与えることはありません。

set-cookieヘッダーをjavascriptset-cookieスクリプトに変換してみてください。これは体に含まれる可能性があります...

于 2011-03-21T15:13:17.083 に答える