确认waf拦截需查 /www/wwwlogs/nginx_error.log 中 lua 相关报错,而非面板错误日志;防护事件中获取规则id后,在规则管理中精准忽略对应路径;ip白名单须全选不检测模块且仅限当前站点。

怎么看日志确认是WAF在拦截,而不是Nginx或系统防火墙
直接查 /www/server/panel/logs/error.log 是错的——它只记面板自身错误,不记录WAF拦截。真正有效的日志路径是:/www/wwwlogs/waf_log/(需在 luawaf.conf 中开启 attacklog = "on")或 Nginx 错误日志 /www/wwwlogs/nginx_error.log。后者更可靠:只要看到类似 lua entry thread aborted: runtime error: /www/server/nginx/waf/init.lua:123 或 access denied by lua waf 的报错,就坐实是 WAF 拦截。
常见干扰项:
- 查
iptables -L或宝塔「安全 → 系统防火墙」里有没有你的IP,和WAF无关; - 面板登录 403?那大概率是「安全 → IP访问限制」没配对,不是WAF的事;
- 返回 500 或空白页但无 Lua 报错?说明
luawaf.conf没生效,或init.lua路径错误、语法有误。
从防护事件里抓规则ID,再精准忽略URL路径
宝塔后台「网站 → 对应站点 → 防火墙 → 防护事件」里,每条拦截记录都带「规则ID」(如 web_rule_1024)。点开详情,能看到触发该规则的具体请求参数、URI 和客户端IP。这才是加白的依据,不是凭感觉填 /api/*。
操作路径必须走对:
- 进「防护规则 → 规则管理」,找到对应
web_rule_1024; - 点「忽略」→「永久忽略」→ 填完整路径(如
/api/v1/submit),不能省略前导/; - 注意:这个忽略只对该规则ID生效;如果同一接口又触发
web_rule_2001(比如SQL注入检测),还得再进规则管理单独忽略一次。
加IP白名单时,“全部不检测”必须勾全,否则形同虚设
IP白名单不是“允许访问”,而是“跳过所有WAF检测模块”。如果你只勾了XSS、没勾CC,那该IP仍可能被每分钟30次请求封掉;只勾SQL注入、没勾文件包含,上传带 ../ 的文件名照样被拦。
正确做法:
- 进「网站 → 对应站点 → 防火墙 → 白名单」→ 新建模板;
- 防护对象选「IP地址」,输入
203.0.113.50或网段192.168.10.0/24; - 下方「不检测的模块」必须全选:CC防护、SQL注入、XSS过滤、文件包含、敏感词过滤;
- 特别注意:这个白名单只作用于当前网站,不是全局;换一个域名要重新配。
前端传参和后端解码比加白更治本,但得避开关键词
很多误拦其实源于参数值本身触发规则库,比如 desc=order by id desc 里的 desc 被当成SQL关键字,select=1 被当成注入信号。靠白名单只是兜底,代码侧规避才减少依赖。
简单可行的改法:
- 前端用
encodeURIComponent()编码敏感字段值,后端用decodeURIComponent()解码; - 把参数名换掉:
desc→sort_order,select→choice,id→item_id; - 避免在GET参数里传HTML、JSON字符串;富文本内容走POST body,且设
Content-Type: application/json; - 别在URL里拼接动态SQL片段,这是最招WAF盯上的写法。
WAF规则本质是模式匹配,不是语义理解。你传的值越像攻击载荷,它越不敢放行——哪怕那是你业务必需的合法数据。











