我有一个运行在与varnish server不同的主机上的apache服务器。如果我们点击apache服务器的ip,它会重定向到apache_ip / index.php / Main_Page。
由于这个apache服务器是清漆的后端服务器,我总是从清漆中获得301响应。
sh-4.3# curl 172.16.217.59 -v
* Rebuilt URL to: 172.16.217.59/
* Trying 172.16.217.59...
* TCP_NODELAY set
* Connected to 172.16.217.59 (172.16.217.59) port 80 (#0)
> GET / HTTP/1.1
> Host: 172.16.217.59
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Date: Thu, 17 Aug 2017 18:00:03 GMT
< Server: Apache/2.4.27 (Debian)
< X-Content-Type-Options: nosniff
< Vary: Accept-Encoding,Cookie
< Cache-Control: s-maxage=1200, must-revalidate, max-age=0
< Last-Modified: Thu, 17 Aug 2017 18:00:03 GMT
< Location: http://172.16.217.173/index.php/Main_Page
< Content-Length: 0
< Content-Type: text/html; charset=utf-8
< X-Varnish: 32789 32787
< Age: 1003
< Via: 1.1 varnish (Varnish/5.0)
< Connection: keep-alive
<
* Curl_http_done: called premature == 0
* Connection #0 to host 172.16.217.59 left intact
如何配置清漆服务器来处理此重定向?我希望转到重定向位置并缓存其内容。
答案 0 :(得分:0)
如果认为最好的解决方案是使用主机名,例如something.com,并将其指向您的Varnish服务器并配置Apache服务器以识别它。
但是如果你不能这样做,你可以改变你的Varnish VCL配置来重写改变主机头的请求,并从响应中改变Location头,这样的事情可以解决问题:
sub vcl_rev {
set req.http.host = "172.16.217.173";
}
sub vcl_fetch {
if (beresp.status == 301 || beresp.status == 302) {
set beresp.http.Location = regsub(beresp.http.Location, "172\.16\.217\.59", "172.16.217.213");
}
}
我没有测试上面的代码,但它应该有效。
这样Apache将始终接收正确的Host头,Varnish将使用Varnish IP地址而不是Apache的ip地址发送重定向
答案 1 :(得分:0)
我认为让清漆遵循重定向是一个好主意。即使可能,301响应也应由客户端解释,而不是由代理解释。
更好的方法是使用主机名,如Dimas所说。
创建yoursite.com 指出你的清漆 在apache配置上注册它 使其成为apache上的默认主机名(因此重定向包含它而不是服务器ip)
其他解决方案都是黑客攻击。你可以:在你有后端响应时使用varnish,解析它并更改位置标题以用你的清漆服务器替换你的apache服务器ip,或者改为实现重试逻辑并遵循重定向(仍然在backend_response子例程中)。