web-dev-qa-db-ja.com

POST応答からの302リダイレクトからのVarnishのキャッシュを停止します

drupal_goto()はデフォルトで302リダイレクトを使用します。これは、フォームリダイレクトを含む多くのリダイレクトが302レスポンスコードで提供されることを意味します。

匿名のトラフィックに対してユーザーが送信したフォームからの302応答をキャッシュするVarnishに問題があります。

最初の302リダイレクトをキャッシュしますが、顧客がフォームで別のオプションを選択した場合は、別のURLにリダイレクトする必要があります。

Drupalコマースサイトの商品ページは、毎月数百万のキャッシュミスと過度のパフォーマンスの問題になります。Drupalベースのページレベルのキャッシュは4,500以上の店舗を展開しているため、オプションです。

これをどのように修正できますか?

1
jozwikjp

応答ステータスが302の場合、フェッチでのキャッシュを無効にする

sub vcl_fetch {
set beresp.grace = 24h;

if (beresp.status >= 400) {
     return (hit_for_pass);
}

// New Set Longer Cache
if (req.http.user-agent ~ "(Googlebot|msnbot|Yandex|Slurp|Bot|Crawl|bot|Baid|Mediapartners-Google)") {
    unset beresp.http.set-cookie;
    set beresp.ttl = 5d;
    return (deliver);
}
if (req.request == "GET" && req.url ~ "\.(css|xml|txt)$") {
    set beresp.ttl = 5d;
    unset beresp.http.set-cookie;
    return (deliver);
}
// multimedia
if (req.request == "GET" && req.url ~ "\.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|img|tga|woff|eot|ttf|svg|wmf|js|swf|ico)$") {
    unset beresp.http.set-cookie;
    set beresp.ttl = 5d;
    return (deliver);
}
//Fix to stop caching 302 responses
if (beresp.status == 302) {
  remove beresp.http.Cache-Control;
  set beresp.http.Cache-Control = "private, no-cache";
  set beresp.ttl = 0s;
}
set beresp.ttl = 5d;
return (deliver);

}

302リダイレクトのキャッシュ制御の設定:

sub vcl_deliver {
// Remove Varnish identifying information from headers
// Note: Both cache hits and cache misses will use this subroutine.

set resp.http.Access-Control-Allow-Origin = req.http.X-Saved-Origin;

remove resp.http.Via;
unset resp.http.Server;
remove resp.http.Age;
remove resp.http.X-Powered-By;
remove resp.http.X-Varnish;
remove resp.http.X-Generator;
remove resp.http.X-Mod-Pagespeed;
remove resp.http.X-Drupal-Cache;
remove resp.http.Link;
set resp.http.Server = "Prism";
// Stop Caching 302 redirects
if (resp.status == 302) {
  remove resp.http.Cache-Control;
  set resp.http.Cache-Control = "private, no-cache";
}

if(req.http.Host ~ "printsites.net"){
     set resp.http.X-Robots-Tag = "noindex, nofollow";
}

return(deliver);

}

2
jozwikjp