问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Nginx反向代理实战:解决路径重定向导致的404错误

创作时间:
作者:
@小白创作中心

Nginx反向代理实战:解决路径重定向导致的404错误

引用
CSDN
14
来源
1.
https://devpress.csdn.net/cloud/63041a35c67703293080a721.html
2.
https://m.blog.csdn.net/u010537398/article/details/81217408
3.
https://blog.csdn.net/shuxiaohua/article/details/124560311
4.
https://m.blog.csdn.net/weixin_47872288/article/details/142441391
5.
https://blog.csdn.net/u011066470/article/details/118905884
6.
https://blog.csdn.net/weixin_45616246/article/details/111573519
7.
https://www.cnblogs.com/kevingrace/p/5882006.html
8.
https://grafana.com/tutorials/run-grafana-behind-a-proxy/#introduction
9.
https://www.cnblogs.com/luxianghao/p/6807081.html
10.
https://www.cnblogs.com/papering/p/9973066.html
11.
https://www.linuxprobe.com/nginx-proxy-pass.html
12.
https://www.cnblogs.com/bigberg/p/7651197.html
13.
https://grafana.com/tutorials/run-grafana-behind-a-proxy/#configure-nginx
14.
https://www.cnblogs.com/woshimrf/p/nginx-proxy-rewrite-url.html

在使用Nginx作为反向代理时,经常会遇到路径处理和重定向的问题。本文将通过一个具体的案例,详细讲解如何解决Nginx反向代理中因路径重定向导致的404错误。

问题描述

当在Nginx中配置反向代理时,如果后端服务(如Grafana)进行了重定向,可能会导致路径丢失或不正确,从而引发404错误。例如,当访问http://your_domain.com/abc时,Nginx将请求转发到http://localhost:3000,但后端服务可能:

  1. 自动追加斜杠:比如重定向到/abc/(导致路径重复)。
  2. 返回绝对路径:比如返回Location: /login(绕过代理前缀)。

这会引发404错误,因为浏览器会直接访问未代理的路径(如/login而不是/abc/login)。

解决方案

方案一:通过Nginx配置解决

可以通过修改Nginx配置来处理路径重写和重定向问题。关键配置包括:

  1. rewrite规则:用于去除子路径前缀
  2. proxy_pass:正确传递路径
  3. proxy_redirect:修正后端返回的重定向路径

具体配置如下:

location /abc/ {
    # 关键:移除/abc前缀,保留子路径
    rewrite ^/abc/(.*) /$1 break;
    proxy_pass http://localhost:3000/;  # 注意末尾的斜杠
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    # 修正后端返回的重定向路径(关键)
    proxy_redirect / /abc/;
}

方案二:修改后端服务配置

如果后端服务支持自定义根路径(如Grafana的serve_from_sub_path),可以直接指定其运行在/abc下:

  1. Grafana配置示例grafana.ini):

    [server]
    domain = your_domain.com
    root_url = %(protocol)s://%(domain)s/abc/
    serve_from_sub_path = true
    
  2. Nginx配置(无需重写路径):

    location /abc/ {
        proxy_pass http://localhost:3000/;  # 末尾斜杠不可省略
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    

验证步骤

  1. 检查后端响应头

    curl -I http://localhost:3000/login  # 直接访问后端,观察Location头
    

    如果返回Location: /login,则需通过proxy_redirect或后端配置修复。

  2. 查看Nginx日志

    tail -f /var/log/nginx/access.log  # 观察实际代理的路径
    
  3. 浏览器测试

    访问http://your_domain.com/abc,检查网络请求的Location头是否包含/abc前缀。

常见问题排查

  • 404持续存在:检查proxy_pass末尾是否遗漏斜杠,或rewrite规则是否生效。
  • 重定向循环:确保后端服务的root_url配置正确(如Grafana的root_url必须包含/abc)。
  • 混合HTTP/HTTPS:如果使用HTTPS,确认proxy_set_header X-Forwarded-Proto $scheme;已配置。

通过以上调整,路径冲突问题应能解决。如果仍有异常,请提供后端服务的具体类型(如Grafana、Node.js应用等)和关键日志片段。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号