根据 cookie 值在 Varnish 中进行重定向

根据 cookie 值在 Varnish 中进行重定向

我们的网站前面有清漆,我们必须尽可能多地缓存。

最近,我们决定放弃针对州际内容的 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);
  }
}

相关内容