nginx -t 仅校验 rewrite 语法合法性,不验证重定向逻辑;需用 curl 测试响应头、add_header 辅助定位、rewrite_log 查看执行过程,并避免正则未锚定、flag 错误、if 条件失效等语义错误。

nginx -t 不能测试重定向规则是否按预期生效,它只检查 rewrite 指令的语法是否合法——比如正则格式、分号、括号、flag 拼写等,不验证逻辑是否正确或是否真能跳转。
看 rewrite 指令本身有没有硬伤
执行 nginx -t 后,如果 rewrite 行存在以下问题,会直接报错:
- 正则表达式未闭合,例如
rewrite ^/old/ /new/ permanent;写成rewrite ^/old/ /new/ permanent(缺分号) - flag 写错,如把
permanent拼成permament或redirectt - 正则中用了未转义的特殊字符,比如
rewrite /file(.pdf)/ /docs/$1;缺少反斜杠转义点号 - 在不支持 rewrite 的上下文里使用,例如放在 http 块顶层(必须在 server 或 location 内)
验证重定向行为是否符合预期
语法通过 ≠ 功能正常。要确认重定向实际效果,需实测响应头和状态码:
- 用
curl -I或curl -v请求目标 URL,观察返回的 Status 和 Location 头 - 检查是否命中了你写的 location 块(可通过添加
add_header X-Debug "hit-rewrite";辅助判断) - 若用
last或break,需结合请求路径变化和后续处理逻辑验证,不能只看跳转 - 启用
rewrite_log on;(需编译时带 --with-debug)并配合error_log /path/to/log notice;查看每一步匹配与替换过程
避免常见语义错误
这些错误 nginx -t 完全无法发现,但会导致重定向失效或循环:
- 正则末尾没加
$,导致rewrite ^/old /new/ permanent;匹配/old-page也跳转 - 多个 rewrite 规则顺序不当,或 flag 使用混乱(如在 location 中误用
last引发重复匹配) - 条件重定向中 if 判断变量为空或未定义,例如
if ($arg_token = "") { rewrite ^/(.*)$ /login?r=$1 redirect; },但 $arg_token 实际未传入 - rewrite 目标含相对路径却没配
proxy_redirect,反向代理场景下 Location 头未被改写


















