nginx反向代理后无限重定向的问题解决方法

 更新时间:2023年08月10日 09:16:47   作者:LYX6666  
这篇文章主要为大家介绍了nginx反向代理后无限重定向的问题解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

先说说奇葩的需求:https转其他网站的http

在项目里用iframe内嵌其他网站,这个“其他网站”不是我们开发的,并且是http,
但浏览器会默认阻止从https网站向http地址发起请求

因此初步的解决方案是:用我们自己的服务器nginx转发一次,虽然服务器到“其他网站”的传输还是明文,但至少可以做到甩锅(至少用户到我们的服务器的传输是SSL......)

然后这个“其他网站”就出现了无限重定向问题。

另外,根据以往的经历,在给WordPress加https的时候,也可能会遇到无限重定向的问题。

原因

本质上是因为:“其他网站”的服务程序具有请求头校验

通常来说,nginx转发的请求,是带有原始请求头信息的请求。
比如:

nginx服务器的地址是https://server1.domin:1111

生产服务器的地址是http://server2.domin:2222

浏览器向https://server1.domin:1111发起请求

此时,虽然nginx把请求代理到了http://server2.domin:2222但由于一系列的参数设置,http请求头中的信息还是https://server1.domin:1111

这种情况下,如果“其他网站”的服务程序(Apache或nginx)中加入了请求头校验,也就是说,如果端口不是2222,就重定向;

如果地址不是server2.domin,就重定向。

而我们的nginx已经把请求头改成了原始信息,自然不能通过他们的验证,所以就会被强制重定向了。

如图,它把我的38004端口的请求重定向到了默认的443,说明对方服务器有地址校验,而且重定向只改变了端口。

而如果我的nginx恰好也用的443,就会无限重定向了。

解决

我们先来看看通常使用的nginx的重写参数:

server {
    listen 38002 ssl;
    server_name server1.domin;
    ssl_certificate server1.domin.cer;
    ssl_certificate_key server1.domin.key;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
        proxy_pass http://server2.domin:2222/;
    }
}

这种情况下,就是直接在代理的请求中,加入原始请求头信息

那么我们怎么改呢?

我们要让对方服务器认为,nginx发过去的请求不是代理过去的,而是直接发过去的。

再换种方式说,此时nginx的作用不再是反向代理,而是正向代理,目的是隐藏真正的请求信息,让对方服

务器认为就是nginx直接请求的对方服务器。

所以我们要把ip、端口等等参数直接写死。

server {
    listen 443 ssl;
    server_name server1.domin;
    ssl_certificate server1.domin.cer;
    ssl_certificate_key server1.domin.key;
    location / {
        proxy_set_header Host server2.domin; // 对方服务器的域名
        proxy_set_header X-Real-IP 123.123.123.123; // 对方服务器的真实地址,从控制台中找到
        proxy_set_header X-Forwarded-For $123.123.123.123:80;
        proxy_set_header X-Forwarded-Host server2.domin; // 对方服务器的域名
        proxy_set_header X-Forwarded-Port 80; // 对方服务器的端口
        proxy_pass http://server2.domin:2222/;
    }
}

于是代理过程就变成了这样:

总结

在我们不得不用nginx代理,并且无法让对方配合的情况下

只要把http中的请求头信息替换为对方网站的请求头信息(而不是使用原始信息)

就可以通过对方服务器的host验证了。

时间仓促,有些地方可能说的不准,但目前能用,如有错误欢迎指正。

以上就是nginx反向代理后无限重定向的问题解决方法的详细内容,更多关于nginx反向代理重定向的资料请关注脚本之家其它相关文章!

相关文章

  • 通过nginx反向代理来调试代码的实现

    通过nginx反向代理来调试代码的实现

    这篇文章主要介绍了通过nginx反向代理来调试代码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • nginx使用nginx-rtmp-module模块实现直播间功能

    nginx使用nginx-rtmp-module模块实现直播间功能

    做的过程出现很多问题,环境其实就需要nginx就可以,然后就是在播放的问题,m3u8的格式,mac直接访问就支持,苹果系统原生H5支持m3u8,还有就是手机直接访问也支持!但是其他其他系统PC端不支持,尝试了好多都不行,最后终于找到了一个支持m3u8格式H5播放
    2017-10-10
  • nginx中proxy_pass各种用法详解

    nginx中proxy_pass各种用法详解

    nginx中配置location代理转发规则的时候不同写法对应不同转发规则。本文就介绍几种常见的匹配情况,感兴趣的可以了解一下
    2021-11-11
  • 教你在容器中使用nginx搭建上传下载的文件服务器

    教你在容器中使用nginx搭建上传下载的文件服务器

    这篇文章主要介绍了容器中使用nginx搭建支持上传下载的文件服务器,在这需要注意为了让nginx支持文件上传,需要下载并运行带有nginx-upload-module模块的容器,需要的朋友可以参考下
    2022-05-05
  • Nginx中运行PHP框架Laravel的配置文件分享

    Nginx中运行PHP框架Laravel的配置文件分享

    这篇文章主要介绍了Nginx中运行PHP框架Laravel的配置文件分享,本文直接给出配置示例,需要的朋友可以参考下
    2015-06-06
  • nginx slice模块的使用和源码分析小结

    nginx slice模块的使用和源码分析小结

    很多请求都会去访问一个巨大的文件,这个时候slice模块就有了用武之地,本文主要介绍了nginx slice模块的使用和源码分析,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • nginx平滑重启和平滑升级的图文教程

    nginx平滑重启和平滑升级的图文教程

    如果改变了Nginx的配置文件(nginx.conf),想重启Nginx,可以发送系统信号给Nginx主进程的方式来进行,下面这篇文章主要给大家介绍了关于nginx平滑重启和平滑升级的相关资料,需要的朋友可以参考下
    2022-01-01
  • Nginx Rewrite模块应用的几种场景

    Nginx Rewrite模块应用的几种场景

    这篇文章主要介绍了Nginx Rewrite模块应用的几种场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Nginx 安装笔记(含PHP支持、虚拟主机、反向代理负载均衡)

    Nginx 安装笔记(含PHP支持、虚拟主机、反向代理负载均衡)

    Nginx安装简记(含PHP支持、虚拟主机、反向代理负载均衡) Nginx,据说高性能和稳定性比Apache还牛,并发连接处理能力强,低系统资源消耗。目前已有250多万web站点在使用
    2009-10-10
  • Nginx设置目录的访问权限实现访问静态资源

    Nginx设置目录的访问权限实现访问静态资源

    遇到Permission denied错误,通常是Nginx用户权限不足,本文就来介绍一下Nginx设置目录的访问权限实现访问静态资源
    2024-10-10

最新评论