2017-08-17 41 views
1

我有一个Apache服务器运行在与varnish服务器不同的主机上。如果我们点击apache服务器的ip,它会重定向到apache_ip/index.php/Main_Page。用apache后端缓存清漆重定​​向

由于这个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

如果认为最好的解决方案是使用host.com(如something.com),并将其指向您的Varnish服务器并配置Apache服务器以识别它。

但是,如果你不能做到这一点,你可以改变你的光油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将总是收到正确的主机头和光油将派出与上光油的IP地址,而不是从Apache的

IP地址重定向
+0

这不起作用。我得到了相同的响应头 –

+0

@ShivamMitra我仍然认为最好的方法是使用主机名,这将节省您与VCL上的规则混乱的头痛,但你应该能够解决我的拉丁编辑问题 –

0

我不认为这是一个好主意,使清漆遵循重定向。即使可能,301响应也不是由代理人真正由客户端解释。

更好的方法是使用Dimas所说的主机名称。

创建yoursite.com 使它指向您的清漆 注册它在你的Apache配置 使其在Apache默认的主机名(这样的重定向包含它,而不是服务器IP)

其他的解决方案是黑客。你可以:清漆时,当你有后端响应,解析它,并更改位置标题,以清漆服务器一替换你的Apache服务器IP,或者实现一个重试逻辑并遵循重定向(仍在backend_response子例程中)。