Nginx重定向异常求助:URL重复追加导致循环重定向如何解决?
解决Nginx重定向无限循环的问题
兄弟,你这问题我太熟了——核心症结就是重定向URL没写完整协议前缀,导致Nginx把它当成相对路径处理,才出现了地址栏URL无限追加的循环!
问题原因拆解
当你写return 301 new.i.p.address/redirect_page/;时,Nginx不会把这段内容识别为独立的新域名,而是会直接把它拼接到当前请求的URL后面。举个实际流程:
- 用户访问
old.i.p.address,Nginx执行return,地址变成old.i.p.address/new.i.p.address/redirect_page/ - 这个新地址仍然匹配当前server的
server_name old.i.p.address,所以Nginx会再次执行return,继续拼接路径 - 反复循环后,就出现了你看到的URL无限叠加的情况
具体解决方案
只需要给重定向的URL加上完整的http://(或https://)前缀,把它变成绝对URL即可。同时还要注意return指令的位置——因为return会直接终止请求处理,放在server最前面的话,后面的location块都不会生效,需要根据你的实际需求调整:
场景1:全站重定向(所有old域名请求都跳转到新地址)
如果你的需求是把old.i.p.address的所有请求都转向新地址,用这个配置:
server { listen 80; server_name old.i.p.address; # 关键:加上http://前缀,让Nginx识别为独立的绝对URL return 301 http://new.i.p.address/redirect_page/; # 注意:如果上面的return生效,下面的location块不会被执行 # 若需要保留部分静态资源处理,需调整return的位置到对应location内 location = /favicon.ico { access_log off; log_not_found off; } location /static { alias /home/rob/pcc_django/staticfiles/; } location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://unix:/run/gunicorn.sock; } }
场景2:仅部分路径重定向(保留其他路径原有处理)
如果只是根路径需要跳转,其他路径(比如/static、/si/home/0/)还要保留原有逻辑,那把return放到location /里:
server { listen 80; server_name old.i.p.address; location ~ /si/home/0/ { return 301 /si/home/; } location = /favicon.ico { access_log off; log_not_found off; } location /static { alias /home/rob/pcc_django/staticfiles/; } location / { # 仅对根路径请求执行重定向 return 301 http://new.i.p.address/redirect_page/; # 若不需要根路径跳转,注释上面的return,恢复原有代理配置 # proxy_set_header Host $http_host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-Proto $scheme; # proxy_pass http://unix:/run/gunicorn.sock; } }
测试小技巧
测试阶段建议先用302临时重定向,避免浏览器缓存了301永久重定向规则,导致你修改配置后看不到实时效果,确认没问题再改回301。
内容的提问来源于stack exchange,提问作者iFunction
相关产品推荐
相关产品推荐

