Nginx双层域名时 iframe嵌入/跳转页面的处理过程


背景

两年前在上一家公司内遇到一个Nginx的问题
当时的场景是 双层nginx代理时(一层域名侧, 一层拆分微服务的网关层)
程序里面会打开一个嵌套的iframe, 便于进行缩放. 但是此时因为只能就近获取 第二层反向代理的 upstream的域名信息.
导致打开的是一个 虚拟的upstream的域名.
外部用户打开时就是提示 http(s)://upstream_server/some/url can not open /404 等问题.
当时耗费了一个中午才在多位同事的协助下解决问题.
方式方法是 proxy_redirect的方式进行 第二层代理传给域名侧代理的(upstream_server)虚拟机域名修改为 域名侧代理的实际地址信息(外网域名). 问题描述比较绕, 但是解决方法还是比较简单的.

解决方法-之一

在 域名侧的负载均衡出增加如下信息:
注意 我这个里面包含了较多的内容, 为了安全以及其他. location / { proxy_set_header Host $http_host ;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
# websocket协议升级 可选
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.xx.xx/; proxy_redirect http://Second_level_proxy_server_name http://Your.corporation.com ;
}

解决方法之二

需要说明, 这个地方有个坑,坑了我三个小时.

当年发现问题是, 因为项目上的nginx配置文件是自己从头到尾跟上家公司最辛苦最靠谱的栋哥一起写的.
为了显得专业(我一直认为, 钱不给够就不是真专业)
自己每一层都写了很多冗余的配置节(这锅不是栋哥的也不是挖到雷的东哥的, 是我的) 而这次的配置文件都非常简洁明了
我其实挺喜欢这种格式的. 但是没想到因为 缺少了一些必要的参数条件,导致一直无法调通.
所以解决方法之二就是, 必须要在靠近应用的那一侧的负载均衡处 增加如下配置.
不然可能跟我一样浪费一晚上刷历史公众号的时间. 注意不增加很多proxy_set_header的设置, 可能总是无法正确跳转, 无比切记.


解决方法之二

upstream Second_level_proxy_server_name {
server 192.168.xx.yy:1234;
} location /your_api_path/ {
proxy_set_header Host $http_host ;
proxy_http_version 1.1;
proxy_read_timeout 3600s;
# websocket 协议升级, 可选
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http:///Second_level_proxy_server_name/your_api_path/;
expires -1;
}

总结-chatgpt的解释

proxy_pass和proxy_redirect是Nginx中用于代理服务器的两个指令。

proxy_pass指令用于将请求转发到后端服务器。它指定了代理服务器将请求转发到的后端服务器的地址。例如:

location / {
proxy_pass http://backend_server;
}
在上面的示例中,所有以"/"开头的请求将被转发到backend_server指定的后端服务器。 proxy_redirect指令用于修改从后端服务器返回的响应头中的Location标头。它允许你替换响应中的网址,以便将客户端重定向到正确的地址。例如: proxy_redirect http://backend_server/ http://frontend_server/;
在上面的示例中,如果后端服务器返回一个重定向的响应,其中包含"http://backend_server/“,则Nginx会将其重定向到"http://frontend_server/”。 这些指令通常一起使用,以便在Nginx代理服务器上配置反向代理。proxy_pass指令用于转发请求,proxy_redirect指令用于修改返回的响应,以便正确地重定向客户端。

总结-个人版

pass 其实是指向的下一层.
redirect 其实是上一层帮下一层处理下一层不知道的事情. 理论上 下层反向代理 是可能不知道上层方向代理的域名的
因为域名可以不是一个, 并且可能经常会变.
写死了域名时不合适的. 在遇到各种变化时太过笨重. 所以pass 实现基本的 反向代理的需求
redirect 实现有域名变化时的需求. nginx 其实非常复杂. 不管是性能还是配置调优可以直接说的地方非常多. 今天这三个小时 其实看了不少文档, 顺便发现自己之前真是笨(现在也是)
使用 location = / 就可以非常简单的设置一个 默认首页了
而不会影响具体的反向代理设置. 自己的思维还是受限, 需要继续开拓, 继续学习.

Nginx双层域名时 iframe嵌入/跳转页面的处理过程的更多相关文章

  1. iframe嵌入的子页面如何刷新父窗口

    iframe中刷新父页面方法及一些按钮刷新代码集合[原创+转]2009-07-23 11:12a页面里iframe了个b页面,我想实现在b页面里一个按钮,一按就刷新a页面,也就是父页面,不是只刷新if ...

  2. nginx二级域名配置自动跳转到一级域名

    nginx二级域名配置自动跳转到一级域名 rewrite配置内容: if ($http_host !~ "^www.aaa.com$") { rewrite ^(.*) http: ...

  3. nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转

    nginx 域名跳转 Nginx跳转自动到www域名规则配置,如果设置使 mgcrazy.com域名在用户访问的时候自动跳转到 www.mgcrazy.com呢?在网上找了好多资料都没有一个完整能解决 ...

  4. Nginx二级域名及多Server反向代理配置

    Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了. 注:nginx反向代理同一ip多个域名,给head ...

  5. 毕设之iframe跳转子页面问题

    我的Django项目中的index.html分为三个层次,head.body.footer.其中body细分为left和right两部分,right的地图是使用iframe嵌入的map.html页面, ...

  6. Nginx多域名多Server反向代理配置

    Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活,如果你要做多用户博客,那么每个用户拥有自己的二级域名也就很容易实现了.下面我就来说说server_name的使用吧:ser ...

  7. iframe及其引出的页面跳转问题

    前提:在前一段的工作中碰到了一些页面跳转,子页面跳到父页面上的等等问题,当时页面总是跳不对,或者跳错,要不就是不需要重新打开窗口,却又重新打开一个了,特此搜寻网上各大博客论坛,加上项目经验整理一篇文章 ...

  8. windows版 nginx配置反向代理实例教程 跳转tomcat和php网站

    抄自 https://www.cnblogs.com/j-star/p/8785334.html 个人理解 nginx端口设置为80,简称n tomcat端口设置为其他,例如8080,简称t php网 ...

  9. nginx 多域名配置 (nginx如何绑定多个域名)

         nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里. 一.每个域名一个 ...

  10. WebSocket 结合 Nginx 实现域名及 WSS 协议访问

    简单了解一下 WebSocket 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器 ...

随机推荐

  1. JS模块化编程规范1——require.js

    目录 1. 概述 2. 详论 2.1. 定义 2.2. 调用 2.3. 入口 3. 结果 4. 参考 1. 概述 require.js是各种网络APP中非常常见的JS依赖库,它其实不仅仅是个模块加载器 ...

  2. Java程序接入ChatGPT

    目录 0 前言 1 还想体验的小伙伴可以试试 2 Java接入前准备 3 官方支持接入语言 4 调用费用 5 接口调用说明 6 代码实现 6.1 postman调用 6.2 Java调用 7 小结 0 ...

  3. Java 编辑PPT SmartArt图形

    本文介绍在Java程序中如何来编辑PPT幻灯片中已有的SmartArt图形,包括重置图形样式.颜色.添加/删除图形节点.编辑节点内容.添加超链接到节点(链接到网页.链接到指定幻灯片)等.在PPT中创建 ...

  4. 华为云GaussDB以技术创新引领金融行业分布式转型

    摘要:分布式数据库以大集群规模.弹性伸缩等优异特性,满足了银行业务发展的多种需求,也因此成为各大银行关键基础设施技术创新建设的首选. 今天,由北京先进数通与华为联合主办的"银行业数字化转型实 ...

  5. 全文手敲代码,教你用Java实现扫雷小游戏

    摘要:本程序共封装了五个类,分别是主类GameWin类,绘制底层地图和绘制顶层地图的类MapBottom类和MapTop类,绘制底层数字的类BottomNum类,以及初始化地雷的BottomRay类和 ...

  6. 谁说Redis不能存大key

    摘要:推荐使用GaussDB(for Redis)搞定"大key"存储,从根本上解决社区版Redis使用风险. 本文分享自华为云社区<华为云GaussDB(for Redis ...

  7. 列举GaussDB(DWS)常见的查询时索引失效场景

    摘要:使用GaussDB(DWS)时,有时为了加快查询速度,需要对表建立索引.有时我们会遇到明明建立了索引,查询计划中却发现索引没有被使用的情况.本文将列举几种常见的场景和优化方法. 本文分享自华为云 ...

  8. Spring解决泛型擦除的思路不错,现在它是我的了。

    你好呀,我是歪歪. Spring 的事件监听机制,不知道你有没有用过,实际开发过程中用来进行代码解耦简直不要太爽. 但是我最近碰到了一个涉及到泛型的场景,常规套路下,在这个场景中使用该机制看起来会很傻 ...

  9. 我的程序跑了60多小时,就是为了让你看一眼JDK的BUG导致的内存泄漏。

    这次的文章从JDK的J.U.C包下的ConcurrentLinkedQueue队列的一个BUG讲起.jetty框架里面的线程池用到了这个队列,导致了内存泄漏. 同时通过jconsole.VisualV ...

  10. You are not using binary logging

    Error Code : 1381You are not using binary logging show variables like '%log_bin%'; 在mysqld配置项下面加上log ...