Varnish如何配置无缓存透传路由并保留X-Forwarded-For等请求头
Varnish 指定路由不缓存透传完整配置
你之前使用pipe模式不符合预期是因为pipe是直接透传TCP连接,跳过Varnish的标准请求头处理逻辑,不会自动追加X-Forwarded-For等代理头,还会出现连接复用导致同连接下后续请求路由匹配异常的问题,改用pass模式即可满足需求:
完整VCL配置
vcl 4.1; # 默认后端,根据实际业务调整参数 backend default { .host = "127.0.0.1"; .port = "8080"; } # 博客业务专属后端 backend blog { .host = "127.0.0.1"; .port = "8083"; } sub vcl_recv { # 匹配所有/blog/开头的路由 if (req.url ~ "^/blog/") { set req.backend_hint = blog; # pass模式:不生成缓存,走正常请求处理流程,自动保留代理头 return (pass); } # 其他路由走默认后端,正常执行缓存逻辑 set req.backend_hint = default; } # 可选配置:双重保障透传路由完全不缓存、不修改响应头 sub vcl_backend_response { if (req.url ~ "^/blog/") { set beresp.ttl = 0s; set beresp.http.Cache-Control = "no-store, no-cache, must-revalidate"; # 不需要Varnish追加标识头可以取消下面这行注释 # unset beresp.http.X-Varnish; } }
配置说明
pass模式会走Varnish标准请求处理流程,自动保留X-Forwarded-For、X-Real-IP等代理请求头,后端服务可以直接读取这些头获取客户端真实IP,完全无感知。- 若有其他需要透传的路由,直接在
vcl_recv模块新增匹配规则即可。 - 配置适配Varnish 4.x及以上版本,若使用3.x版本需要调整对应语法。
内容的提问来源于stack exchange,提问作者Vova Rozhkov
相关产品推荐
相关产品推荐

