当Nginx配置重定向出现循环跳转时,需重点检查正则表达式逻辑、服务器块优先级及$scheme变量使用。本文通过3个典型场景解析,结合curl命令调试和开源工具检测,提供可落地的解决方案与防重复跳转配置模板。
为什么Nginx重定向会进入死循环?
某电商平台在配置HTTPS强制跳转时,用户访问持续触发ERR_TOO_MANY_REDIRECTS
错误。经排查发现配置中同时存在两个逻辑冲突的server块:
- 错误配置:未正确区分80/443端口监听规则
- 隐藏陷阱:未设置
return 301
导致递归重定向
错误示例
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri; 未指定$scheme导致循环
}
如何用curl命令快速定位问题节点?
使用curl -vL
追踪重定向链路,观察Location头变化:
- 首次请求:
HTTP/1.1 301 Moved Permanently
- 第二次跳转:
Location: https://example.com:443
- 第三次跳转:
Location: https://example.com:443//
通过nginx -T
查看完整配置时,发现重复的rewrite规则叠加端口号。修正方案:
正确配置
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
重定向规则优先级怎么排序?
某社区论坛因location匹配顺序错误导致无限重定向:
错误顺序 | 正确顺序 |
---|---|
location / {
|
location /new/ {
|
调整规则顺序后,重定向链条从3级降为2级,TPS提升40%。
FAQ:高频问题速查指南
- Q:已配置$scheme变量仍出现循环?
- A:检查是否误用
proxy_redirect
或存在CDN缓存旧配置 - Q:如何防止重定向丢失URL参数?
- A:使用
$request_uri
替代$uri
保留完整请求路径 - Q:负载均衡环境下如何避免跳转不一致?
- A:统一配置模板并通过
nginx -s reload
灰度发布