Apache终止SSL时HTTP转HTTPS重定向异常求助(含Varnish配置)
解决方案:HTTP到HTTPS重定向异常与循环问题修复
问题根源
- VCL配置逻辑失效:原VCL通过判断
server.ip的端口是否为443触发重定向,但当前Varnish仅监听80端口,该条件永远不成立,导致HTTP请求无法触发重定向。 - Apache配置引发循环:SSL虚拟主机中配置的
ProxyPass / http://127.0.0.1:80/会将HTTPS请求转发回Varnish的80端口,形成「Varnish重定向→Apache转发→Varnish重定向」的死循环。
步骤1:修正Varnish VCL配置
替换原VCL内容为以下逻辑,直接针对HTTP请求触发HTTPS重定向:
sub vcl_recv { # 拦截所有HTTP请求,重定向到HTTPS if (req.http.X-Forwarded-Proto != "https") { set req.http.location = "https://" + req.http.host + req.url; return(synth(301)); } # 确保后端Apache能识别请求协议 if (!req.http.X-Forwarded-Proto) { set req.http.X-Forwarded-Proto = "https"; } } sub vcl_synth { if (resp.status == 301 || resp.status == 302) { set resp.http.location = req.http.location; return(deliver); } }
步骤2:修复Apache SSL配置
删除SSL虚拟主机末尾的以下错误配置,终止循环:
ProxyPreserveHost On ProxyPass / http://127.0.0.1:80/ RequestHeader set X-Forwarded-Port "443" RequestHeader set X-Forwarded-Proto "https"
额外说明
若需要Varnish缓存HTTPS请求的响应,需调整架构为:
- 用户HTTPS请求→Apache 443(终止SSL)→转发到Varnish的缓存端口(如6082)
- Varnish将缓存后的响应返回给Apache,再由Apache返回给用户
但当前需求仅为Apache终止SSL并实现HTTP转HTTPS重定向,上述修正已足够解决问题。
内容的提问来源于stack exchange,提问作者Umair Suraj
相关产品推荐
相关产品推荐

