nginx rewrite调试需据版本选择日志方式:1.18.x及更早用rewrite_log on配合notice级error_log;≥1.19.0须启用--with-debug并设error_log ... debug,再过滤关键字定位问题。

在 Nginx 中调试 rewrite 规则时,rewrite_log 是一个关键但常被忽略的调试工具。它能将每次重写匹配、跳转、变量替换的过程输出到 error log,帮助你快速定位 if、rewrite、return 等指令的实际执行路径。不过要注意:该指令自 Nginx 1.19.0 起已被废弃,**仅在旧版本(如 1.18.x 及更早)中有效**;新版需改用 error_log ... debug 配合 debug 编译模块。
确认 Nginx 版本与编译选项
运行以下命令检查当前环境是否支持 rewrite 日志:
-
nginx -v查看版本号 —— 若 ≥ 1.19.0,则rewrite_log不可用,必须启用 debug 日志 -
nginx -V 2>&1 | grep -o with-debug确认是否带--with-debug编译,这是开启详细重写日志的前提 - 若未启用 debug 模块,需重新编译 Nginx 并添加
--with-debug参数
旧版本(≤1.18.x):启用 rewrite_log
在 http、server 或 location 块中添加:
-
rewrite_log on;—— 开启 rewrite 执行日志(默认 off) -
error_log /var/log/nginx/rewrite.log notice;—— 单独指定日志文件,并设为notice级别(rewrite_log实际输出为 notice 级别) - 注意:
rewrite_log必须配合error_log使用,且日志级别不能高于notice(如info或debug无效)
新版(≥1.19.0):用 debug 日志替代
由于 rewrite_log 已移除,需依赖 debug 日志捕获重写细节:
- 确保 Nginx 编译时含
--with-debug - 在配置中设置:
error_log /var/log/nginx/debug.log debug; - 重启后,所有重写相关动作(如 “using regex …”, “rewritten data”, “test location”, “matched location”)都会出现在 debug.log 中
- 建议搭配
tail -f /var/log/nginx/debug.log | grep -i "rewrite\|regex\|location"实时过滤关键行
调试技巧与常见陷阱
无论使用哪种方式,高效调试 rewrite 需注意:
- 避免全局开启 debug:debug 日志量极大,仅在测试环境或临时排障时启用,生产环境切勿长期开启
-
区分执行顺序:Nginx 的 rewrite 在
server→location→if→rewrite中逐层触发,日志会按实际执行流打印,注意时间戳和请求 URI 上下文 -
if 是伪指令:
if块内嵌rewrite易引发意外行为,日志中若出现 “if is not recommended” 提示,说明存在潜在逻辑风险 -
变量展开时机:如
$request_uri和$uri含义不同,日志中会明确显示使用的是哪个值,可据此验证变量是否按预期被解析











