Nginx中启用rewrite调试日志需配置error_log path debug且编译时含--with-debug;rewrite_log已弃用,debug日志量大须临时启用并及时降级。

要在 Nginx 的 http 块中开启重写日志(rewrite log)用于调试 rewrite 规则,仅靠 rewrite_log on; 是不够的——它必须配合 debug 级别的错误日志才能生效,且该指令在较新版本 Nginx 中已被弃用。
rewrite_log 指令已弃用,需用 error_log + debug
从 Nginx 1.19.5 开始,rewrite_log 指令被正式移除。即使旧版本中写了 rewrite_log on;,若未将 error_log 级别设为 debug,也不会输出重写信息。
-
正确做法:在
http块(或server、location块)中设置:error_log /path/to/error.log debug; - 路径需确保 Nginx 进程有写入权限;频繁调试时建议单独指定文件,避免污染主错误日志
- debug 日志量较大,仅临时启用,调试完及时降级为
warn或error
确保编译时启用了 debug 日志支持
Nginx 默认编译可能不包含 debug 日志模块。若配置了 error_log ... debug 却无 rewrite 调试输出,检查是否支持:
- 运行
nginx -V 2>&1 | grep -o with-debug,输出含with-debug表示支持 - 若无,需重新编译:configure 时加上
--with-debug参数 - 注意:生产环境一般不启用 debug 编译,调试宜在测试环境进行
rewrite 调试日志的实际输出内容
启用后,Nginx 会在 error.log 中记录类似以下行(每条 rewrite 执行都会触发):
2024/05/20 14:22:33 [debug] 12345#0: *6 http script regex: "^/old/(.*)$" 2024/05/20 14:22:33 [debug] 12345#0: *6 http script regex: "^/old/(.*)$" matched 2024/05/20 14:22:33 [debug] 12345#0: *6 http script capture: "path/to/file" 2024/05/20 14:22:33 [debug] 12345#0: *6 http script value: "/new/path/to/file" 2024/05/20 14:22:33 [debug] 12345#0: *6 rewrite phase: 3
这些日志能帮你确认正则是否匹配、捕获组是否正确、最终跳转目标是否符合预期。
替代方案:用 return + log\_not\_found 验证匹配逻辑
若无法启用 debug 日志,可用更轻量的方式辅助判断 rewrite 是否触发:
- 在目标
location中加log_not_found off;避免 404 冗余日志 - 临时用
return 200 "matched: $uri\n";替代 rewrite,直接返回 URI 值观察原始请求路径 - 结合
$args、$request_uri等变量打印上下文,快速定位问题位置











