我正在尝试设置一个中间清漆服务器,以允许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);
但也许我不明白这是如何运作的?任何帮助将不胜感激
答案 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缩进,但我觉得它更具可读性。