最直接有效的方式是用 curl -I 命令查看响应头,确认重定向状态码(301/302)和 Location 头是否符合预期;若为内部重写则返回 200 OK;需结合日志、变量输出及正则测试验证 rewrite 是否生效并避免循环。

最直接有效的方式是用 curl 命令加 -I 参数 查看响应头,确认重定向状态码和跳转目标是否符合预期。
用 curl 检查 HTTP 响应头
执行命令:
curl -I http://your-domain.com/oldpath
观察返回的 HTTP 状态码 和 Location 头:
- 若配置了
permanent或redirect,应看到301 Moved Permanently或302 Found,且Location: https://your-domain.com/newpath - 若用了
last或break,通常返回200 OK(内部重写,无跳转),URL 地址栏不变,但实际服务的是新路径内容
验证 rewrite 是否真正生效(内容级)
仅看响应头不够,还需确认后端是否收到改写后的 URI:
- 在对应 location 中临时加日志,例如:
access_log /var/log/nginx/rewrite_test.log; - 或启用 rewrite 日志:
rewrite_log on;(需同时设error_log /path/to/error.log notice;),然后查 error 日志里是否有匹配和替换记录 - 配合
$request_uri或$uri变量输出到响应体(如用 echo 模块或返回 JSON),直观对比原始请求与重写后值
检查正则表达式是否匹配准确
常见问题出在正则边界和捕获逻辑:
- 确保开头用
^、结尾用$(除非有意匹配子串) - 测试带参数的 URL 时注意:
$args不参与 rewrite 匹配,但会被自动拼接到新 URL 后;如需保留或过滤参数,得用set+if或return配合处理 - 用在线工具(如 regex101.com)粘贴你的正则和示例 URI,验证分组
$1、$2是否捕获正确
避免循环重写导致 500 错误
Nginx 对 rewrite 循环限制为 10 次,超限即报 500:
- 如果访问页面返回 500,立刻检查 rewrite 规则是否形成闭环(比如
/a→/b,而/b又被另一条规则 →/a) - 用
curl -v查看完整请求过程,观察是否发生多次跳转 - 把 rewrite 放在更精确的 location 块中(而非宽泛的
location /),减少误匹配











