清漆缓存http 301 302标头位置重定向

时间:2013-12-20 16:01:43

标签: ruby-on-rails linux centos varnish varnish-vcl

我正在尝试设置一个中间清漆服务器,以允许xyz.com上的Rails应用程序处理其他几个域名。

Rails应用程序不时会输出一些301/302重定向,而且显然清漆不会更改这些标题,因此访问者会被重定向到原始站点(位于面向公众的清漆服务器后面),所以会发生什么......错误。

有没有办法在清漆方面配置这种重写?

在vcl_fetch下我尝试了以下内容:

if ( (beresp.status == 301) || (beresp.status == 302) ) {
    set req.url = regsub(req.url,".*",regsuball(regsub(beresp.http.Location,"^http://[^/]+(.*)","\1"),"[+]","%2520"));
    return(restart);

但也许我不明白这是如何运作的?任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

在与你的正则表达式斗争后,想一下用例......我想你可能会做一件非常简单的事情,比如重写位置并缓存对象更正(并将重定向留给客户端浏览器)。

vcl_fetch

# ...
if ( beresp.status == 301
  || beresp.status == 302
) {
  # Check if we're redirecting to a different site
  if ( ! beresp.http.Location ~ req.http.host ) {
    # Rewrite HTTP Location header to cache it and pass redirection to client
    set beresp.http.Location = regsub(
                                 beresp.http.Location,
                                 "^http://[^/]+/",
                                 "http://" + req.http.host + "/"
                               );
  }
}
# ...

如果您仍然希望在Varnish内的其他网址上重新启动请求,我会尝试(再次在vcl_fetch上):

# ...
if ( beresp.status == 301
  || beresp.status == 302
) {
  # Add a header so you can debug cleanly on varnishlog
  set req.http.X-Redirected-Orig = beresp.http.Location;
  # Rewrite request host
  set req.http.host = regsub(
                        regsub(
                          beresp.http.Location,
                          "^http://",
                          "",
                        ),
                        "^([^/]+)/.*$",
                        "\1"
                      );
  # Rewrite request url
  set req.url = regsub(
                  beresp.http.Location,
                  "^http://[^/]+/(.*)$",
                  "/\1",
                );
  # Add a header so you can debug cleanly on varnishlog
  set req.http.X-Redirected-To = "http://" + req.http.host + req.url;
  return (restart);
}
# ...

PS:请原谅我的regsub缩进,但我觉得它更具可读性。