You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带前置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:06:32