我们的网站前面有清漆,我们必须尽可能多地缓存。
最近,我们决定放弃针对州际内容的 GeoIP 重定向,转而采用更传统的“选择您的位置”页面。此页面为其“默认”位置设置了一个 cookie,理想的结果是让 varnish 读取此 cookie 并仅在“/”时重定向。
这项功能(虽然有点不靠谱)应该在 Varnish 中得到支持,但我们一直没能让它工作。它应该能工作吗?我们是不是做了什么不该做的事情?
除了拥有未缓存的静态 HTML 页面之外,我们还有什么其他选择?除了 varnish 之外,我们还能用其他东西来覆盖吗?只是那个页面?
当我们部署更改而没有使用 Varnish 缓存时,我们遇到了严重的性能问题,因为该站点是建立在 Drupal 上的,并且必须引导每次加载。
如果确定 Varnish应该做我们想做的事,我会为这个问题添加一些 vcl 配置。
编辑看起来最好的选择是让 varnish 不缓存“/”并处理 Apache 中基于 cookie 的重定向。
RewriteCond %{REQUEST_URI} ^/?$
RewriteCond %{HTTP_COOKIE} cookie_name=([^;]+)
RewriteRule .* http://site/%1 [R=301,L]
似乎满足了我们的需要。
答案1
这或多或少可以在 Varnish 上完美实现:
sub vcl_recv {
if ( req.http.cookie ~ "cookie_name") {
error 751 "http://site" + req.url;
}
}
sub vcl_error {
if (obj.status == 751) {
/* Get new URL from the response */
set obj.http.Location = obj.response;
/* Set HTTP 301 for permanent redirect */
set obj.status = 301;
return(deliver);
}
}