2

VarnishでキャッシュするPHPページがあります:http://categories.php?name=NAME。次のようなESIスクリプトがあります:<esi:include src = "/ esi.php" />

すべてのページに同様のヘッダー、フッター、サイドバーがあるため、VCLハッシュを実行するときにname = NAMEを削除して、すべてのページが同じキャッシュを取得できるようにします。

問題は、esi.phpスクリプト内で、どのページがESIリクエストを発行したかを知りたいということです。それはcategories.php?name = Aまたはcategories.php?name = Bでしたか?

これどうやってするの?この情報はどこにも見つかりませんでした。

HTTP REFERERの中にあるのではないかと思っていましたが、そうではありません。:(

4

3 に答える 3

2

同じ問題、同じ状態。それを解決するために、親 URL をパラメーターとして ESI URL に追加しました。

<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" />
于 2013-09-24T08:01:39.363 に答える
1

vcl_recv でこれを試してください:

if (req.esi_level == 0) {
    set req.http.X-Esi-Parent = req.url;
}   

これにより、このメイン リクエストに関連するすべての esi リクエストが、バックエンドで読み取ることができる「X-Esi-Parent」と呼ばれるリクエスト ヘッダーで元の URL を送信することになります。

アップデート

コメントの Aleksandr は、vcl_recv で設定されたヘッダーが後続の esi 要求には存在しないため、これが機能しないことを正しく指摘しています。クライアントからのヘッダーのみです。何人かの人々がリストサーブで同様の質問をしましたが、回答はありませんでした:

https://www.varnish-cache.org/lists/pipermail/varnish-misc/2012-February/021706.html

http://marc.info/?l=varnish-dev&m=135273366517518&w=2

したがって、すべてのクエリ文字列の組み合わせで esi タグを含む応答をキャッシュする場合、これを行う方法はないようです。

于 2013-07-18T01:07:07.013 に答える
1

Varnish 4.1以降では、次のことができます。

 if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") {
     ...
 }
于 2016-12-11T19:37:23.390 に答える