Nginx 配置 proxy_pass 后 返回404的问题

项目场景

需求:

  • 开发一个平台系统,前端需要调用多个来自不同服务器的接口,为了满足该需求,需要通过Nginx去转发代理不同的接口地址,防止跨域,实现多接口的调用。
    在一次生产涉及多次转发的配置中, 需求是下面的图:
    在这里插入图片描述

问题描述

问题

在配置好了 proxy_pass 之后,请求 https://smartaitest.com/aitools 直接返回 404,没有什么其他的异常。 但是我们直接请求后端 http://ai-ttxt.com/ 是正常响应的。 看日志请求也是转发到了 http://ai-ttxt.com/。但是转发后的请求响应就是404.
在这里插入图片描述

  • 在配置nginx接口转发代理的过程中发现两种不同状况
    1. 当转发的地址为 ip 时可正常访问。
    1. 当转发的地址为 域名 时报错为404。

问题原因

我们的默认的 Nginx的 proxy_set_header 配置是
proxy_set_header Host $host;

当我们是这个的设置的时候,当第一层 Nginx(Nginx1)代理后,我们请求的域名是 www.djx.com(假设域名) ,从这个请求的 header 获取到的 host 的值是 www.djx.com, 我们通过 配置将 host 的值设置为转发 的Host 值,但是请求的域名 , 也就是 header 里面的是 host 字段 , 请求的域名和 header 里面的 Host 的不一致导致的。
在这里插入图片描述

总结一下 出现两种情况的原因:

    1. 当转发的地址为 ip 时可正常访问。
    1. 当转发的地址为 域名 时报错为404。
  1. 当使用 proxy_pass 将请求转发到 IP 地址时,Nginx 会将请求的 Host 头信息保持不变地传递给后端服务器。
  2. 但是当 proxy_pass 设置为域名时,默认情况下,Nginx 会将请求的 Host 头信息设置为当前请求的域名。
  • 这就意味着,如果你使用 proxy_pass 设置为域名时,Nginx 会将请求的 Host头信息设置为当前请求的域名,而不是你指定的域名。这可能会导致后端服务器无法正确识别请求的来源,从而返回 404 错误。

最终造成代理转发访问404的问题出现


解决方案

修改Nginx的 proxy_set_header 配置

proxy_set_header Host $proxy_host;

修改前的nginx.conf 配置

server {
        listen 99;
        server_name _;

        client_max_body_size 100m;

        access_log /var/log/nginx/access-front.log main;
        error_log /var/log/nginx/error-front.log notice;

         location /aitools {
                alias /opt/html/dist;
                index index.html index.htm;

                try_files $uri $uri/ /aitools/index.html;  #aitools为路由 而不是目录
        }
        location /aitools/vapi/ {
                proxy_pass http://ai-ttxt.com/;  # 替换为实际的后端服务器地址

                proxy_set_header Host $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;
        }
    }

修改后的配置

server {
        listen 99;
        server_name _;

        client_max_body_size 100m;

        access_log /var/log/nginx/access-front.log main;
        error_log /var/log/nginx/error-front.log notice;

         location /aitools {
                alias /opt/html/dist;
                index index.html index.htm;

                try_files $uri $uri/ /aitools/index.html;  #aitools为路由 而不是目录
        }
        location /aitools/vapi/ {
                proxy_pass http://ai-ttxt.com/;  # 替换为实际的后端服务器地址

                proxy_set_header Host $proxy_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://ai-ttxt.com/ 的接口地址后最好要将末尾的 /代理进去

proxy_set_header Host $host; 和 proxy_set_header Host $proxy_host; 的区别

proxy_set_header Host $host; 和 proxy_set_header Host $proxy_host; 在 Nginx 配置中用于设置代理请求的 Host 头信息:

  • $host 变量: $host 变量表示客户端发送请求时的 Host 头信息,即请求的目标域名。它是 Nginx 内置的变量,表示当前请求的主机名。
  • $proxy_host 变量: $proxy_host 变量表示 Nginx 代理请求时使用的目标服务器的主机名或 IP 地址。它是 Nginx 内置的变量,表示当前请求中被代理的服务器的主机名或 IP 地址。

因此,区别主要在于这两个变量表示的含义:

  1. proxy_set_header Host $host; 将请求的 Host 头信息设置为客户端发送请求时的目标域名。这通常用于将请求的 Host 头信息传递给后端服务器,以确保后端服务器能够正确处理请求。

  2. proxy_set_header Host $proxy_host; 将请求的 Host 头信息设置为 Nginx 代理请求时使用的目标服务器的主机名或 IP 地址。这通常用于在代理请求时设置一个自定义的 Host 头信息,而不是直接使用客户端发送的 Host 头信息。

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
出现"nginx proxy_pass 404"错误通常是由于配置问题导致的。要解决这个问题,需要检查以下几个方面: 1. 确保代理目标的服务器正在运行并且可以通过指定的URL进行访问。例如,在给定的示例中,确保www.baidu.com服务器是可访问的。 2. 检查proxy_pass指令的配置。在给定的示例中,proxy_pass指令是将请求代理到http://www.baidu.com/。确保该URL正确并且不存在拼写错误。 3. 确保代理目标服务器上的相应路径和资源存在。在给定的示例中,如果代理目标服务器上不存在相应的路径,就会出现404错误。确保代理目标服务器上存在正确的路径和资源。 4. 检查Nginx服务器的日志文件,查看是否有其他错误消息或警告。日志文件可以提供有关问题的更多详细信息。 总结起来,要解决"nginx proxy_pass 404"错误,您需要确保代理目标服务器的可访问性,检查proxy_pass指令的配置,确保代理目标服务器上存在正确的路径和资源,并查看Nginx服务器的日志文件以获取更多信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [nginx配置proxy_pass之后返回404问题Nginx host相关变量说明](https://blog.csdn.net/eaglecolin/article/details/125538212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [记录一次 Nginx 配置 proxy_pass返回404问题](https://blog.csdn.net/qq_40848737/article/details/112213079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值