Nginx配置proxy_pass后返回404的问题及解决

 更新时间:2024年06月20日 08:58:02   作者:老友@  
这篇文章主要介绍了Nginx配置proxy_pass后返回404的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

项目场景

需求

开发一个平台系统,前端需要调用多个来自不同服务器的接口,为了满足该需求,需要通过Nginx去转发代理不同的接口地址,防止跨域,实现多接口的调用。

在一次生产涉及多次转发的配置中, 需求是下面的图:

问题描述

问题

在配置好了 proxy_pass 之后,请求 https://smartaitest.com/aitools 直接返回 404,没有什么其他的异常。

但是我们直接请求后端 http://ai-ttxt.com/ 是正常响应的。

看日志请求也是转发到了 http://ai-ttxt.com/。但是转发后的请求响应就是404.

在配置nginx接口转发代理的过程中发现两种不同状况

  • 当转发的地址为 ip 时可正常访问。
  • 当转发的地址为 域名 时报错为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 的不一致导致的。

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

  • 当转发的地址为 ip 时可正常访问。 
  • 当转发的地址为 域名 时报错为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 地址。

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

  • proxy_set_header Host $host; 将请求的 Host 头信息设置为客户端发送请求时的目标域名。这通常用于将请求的 Host 头信息传递给后端服务器,以确保后端服务器能够正确处理请求。
  • proxy_set_header Host $proxy_host; 将请求的 Host 头信息设置为 Nginx 代理请求时使用的目标服务器的主机名或 IP 地址。这通常用于在代理请求时设置一个自定义的 Host 头信息,而不是直接使用客户端发送的 Host 头信息。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • nginx http响应限速的具体实现

    nginx http响应限速的具体实现

    本文主要介绍了nginx http响应限速的具体实现,可以使用limite_rate和limit_rate_after来限制HTTP响应的速度,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Nginx配置文件详解

    Nginx配置文件详解

    Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。这篇文章主要介绍了Nginx配置详解,需要的朋友可以参考下
    2017-05-05
  • 深入分析nginx+php-fpm服务HTTP状态码502

    深入分析nginx+php-fpm服务HTTP状态码502

    这篇文章主要介绍了深入分析nginx+php-fpm服务HTTP状态码502,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • nginx https 443端口配置的方法

    nginx https 443端口配置的方法

    本文主要介绍了nginx https 443端口配置的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 基于Nginx+lua实现简单的XSS攻击拦截

    基于Nginx+lua实现简单的XSS攻击拦截

    WAF即web应用防火墙,Nginx是一个主流的代理服务,除了本身的Nginx日志,作为用户肯定也支持对请求信息进行操作, 很多都是通过在代理服务器上挂载规则特征,实现软件层面的软WAF进行WEB防护,本文主要给大家介绍了Nginx+Lua实现一个简单的XSS攻击拦截,需要的朋友可以参考下
    2024-01-01
  • nginx简单配置多个server的方法

    nginx简单配置多个server的方法

    这篇文章主要介绍了nginx简单配置多个server的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • CentOS 7.3.1611编译安装Nginx1.10.3+MySQL5.7.16+PHP7.1.2

    CentOS 7.3.1611编译安装Nginx1.10.3+MySQL5.7.16+PHP7.1.2

    这篇文章主要介绍了CentOS 7.3.1611编译安装Nginx1.10.3+MySQL5.7.16+PHP7.1.2,需要的朋友可以参考下
    2018-01-01
  • Nginx根据不同浏览器语言配置页面跳转的方法

    Nginx根据不同浏览器语言配置页面跳转的方法

    这篇文章主要介绍了Nginx根据不同浏览器语言配置页面跳转的方法,包括一个简体繁体的基本判断方法及实际根据中英文跳转的例子,需要的朋友可以参考下
    2016-04-04
  • nginx服务器access日志中大量400 bad request错误的解决方法

    nginx服务器access日志中大量400 bad request错误的解决方法

    这篇文章主要介绍了nginx服务器access日志中大量400 bad request错误的解决方法,本文结论是空主机头导致的大量400错误日志,关闭默认主机的日志记录就可以解决问题,需要的朋友可以参考下
    2015-01-01
  • 详解nginx 的 default_server 定义及匹配规则

    详解nginx 的 default_server 定义及匹配规则

    这篇文章主要介绍了详解nginx 的 default_server 定义及匹配规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论