Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 清漆缓存http 301 302头位置重定向_Ruby On Rails_Linux_Centos_Varnish_Varnish Vcl - Fatal编程技术网

Ruby on rails 清漆缓存http 301 302头位置重定向

Ruby on rails 清漆缓存http 301 302头位置重定向,ruby-on-rails,linux,centos,varnish,varnish-vcl,Ruby On Rails,Linux,Centos,Varnish,Varnish Vcl,我正在尝试设置中间的varnish服务器,以允许xyz.com上的Rails应用程序在其他几个域名上工作 发生的事情是Rails应用程序不时输出一些301/302重定向,显然varnish不会更改这些标题,因此访问者会被重定向到原始站点(位于面向公众的varnish服务器后面),所以。。。错误 有没有一种方法可以配置这种重写 在vcl_fetch下,我尝试了以下操作: if ( (beresp.status == 301) || (beresp.status == 302) ) { se

我正在尝试设置中间的varnish服务器,以允许xyz.com上的Rails应用程序在其他几个域名上工作

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

有没有一种方法可以配置这种重写

在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);

但也许我不明白这到底是怎么回事?在与您的正则表达式斗争并思考用例后,将非常感谢您的任何帮助。

。。。我认为您可能可以做一件非常简单的事情,例如重写位置并缓存已更正的对象(并将重定向保留到客户端浏览器)

vcl\u 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 + "/"
                               );
  }
}
# ...
# ...
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);
}
# ...

如果您仍然希望在Varnish中的其他url上重新启动请求,我将重试(在
vcl\u fetch
上重试):

PS:请原谅我的regsub缩进,但我认为它更可读