drupal_goto()
はデフォルトで302リダイレクトを使用します。これは、フォームリダイレクトを含む多くのリダイレクトが302レスポンスコードで提供されることを意味します。
匿名のトラフィックに対してユーザーが送信したフォームからの302応答をキャッシュするVarnishに問題があります。
最初の302リダイレクトをキャッシュしますが、顧客がフォームで別のオプションを選択した場合は、別のURLにリダイレクトする必要があります。
Drupalコマースサイトの商品ページは、毎月数百万のキャッシュミスと過度のパフォーマンスの問題になります。Drupalベースのページレベルのキャッシュは4,500以上の店舗を展開しているため、オプションです。
これをどのように修正できますか?
応答ステータスが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);
}