带前置Varnish的WordPress站点:需放行/wp-login.php?action=postpass
解决Varnish拦截WordPress受保护页面密码验证的问题
我碰到过好几个类似的场景,你的问题核心是原来的VCL规则把所有/wp-login.php的请求都拦截了,但WordPress的受保护页面验证依赖的/wp-login.php?action=postpass是面向前端普通用户的操作,不该被白名单限制。下面是具体的解决步骤:
1. 调整白名单拦截规则,排除postpass动作请求
找到你原有的/wp-login.php拦截VCL代码,通常类似这样:
if (req.url ~ "^/wp-login.php") { if (!client.ip ~ white_list) { return (synth(403, "Forbidden")); } }
把它修改为:
if (req.url ~ "^/wp-login.php" && req.url !~ "action=postpass") { if (!client.ip ~ white_list) { return (synth(403, "Forbidden")); } }
这里新增的&& req.url !~ "action=postpass"条件,会让Varnish只拦截不是postpass动作的/wp-login.php请求,既保留了后台登录的白名单保护,又放开了受保护页面的密码验证通道。
2. 确保postpass请求不被缓存
密码验证是和用户会话绑定的动态操作,不能被Varnish缓存,所以在vcl_recv段添加以下规则:
if (req.url ~ "action=postpass") { return (pass); }
这个规则会让所有包含action=postpass的请求直接透传到后端WordPress,跳过缓存环节,避免出现验证状态异常的问题。
3. 验证效果
修改完VCL后,记得重新加载Varnish配置,然后做这几项测试:
- 用非白名单IP访问受保护页面,输入密码后应该能正常进入页面,不会触发403拦截
- 用非白名单IP直接访问
/wp-login.php(不带action参数),依然会被403拦截,保证后台登录的安全性 - 白名单IP访问
/wp-login.php不受任何影响,正常进入登录页面
内容的提问来源于stack exchange,提问作者Chase
相关产品推荐
相关产品推荐

