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


背景

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

解决方法-之一

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

解决方法之二

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


解决方法之二

  1. upstream Second_level_proxy_server_name {
  2. server 192.168.xx.yy:1234;
  3. }
  4. location /your_api_path/ {
  5. proxy_set_header Host $http_host ;
  6. proxy_http_version 1.1;
  7. proxy_read_timeout 3600s;
  8. # websocket 协议升级, 可选
  9. #proxy_set_header Upgrade $http_upgrade;
  10. #proxy_set_header Connection "upgrade";
  11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  12. proxy_pass http:///Second_level_proxy_server_name/your_api_path/;
  13. expires -1;
  14. }

总结-chatgpt的解释

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

总结-个人版

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

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. SQL Server系列:系统函数之日期和时间函数

    1.current_timestamp :获取数据库系统时间戳 --获取数据库系统时间戳 select current_timestamp go 2.getdate() :获取数据库系统时间戳 --获 ...

  2. 关于three.js中的矩阵更新

    目录 1. 概述 2. 详解 1. 概述 使用如下代码绘制一个面: 'use strict'; function init() { //console.log("Using Three.js ...

  3. C# 将Word转为PDF时,设置PDF文档保护

    本文以C#代码示例展示如何将Word转为PDF时,设置PDF文档保护,可设置PDF文档打开密码保护以及权限密码保护.附VB.NET代码,有需要可供参考. 程序环境: 1.Word测试文档:.docx ...

  4. 探索Reactor网络模型在当今应用领域的革新

    本文分享自华为云社区<驾驭网络技术的未来:探索Reactor网络模型在当今应用领域的革新>,作者: Lion Long . 本文介绍了Linux网络设计中的Reactor网络模型及其在实际 ...

  5. Spark-submit执行流程,了解一下

    摘要:本文主要是通过Spark代码走读来了解spark-submit的流程. 1.任务命令提交 我们在进行Spark任务提交时,会使用"spark-submit -class .....&q ...

  6. MySQL数据库事务隔离性的实现

    摘要:事实上在数据库引擎的实现中并不能实现完全的事务隔离,比如串行化. 本文分享自华为云社区<[数据库事务与锁机制]- 事务隔离的实现>,原文作者:技术火炬手 . 事实上在数据库引擎的实现 ...

  7. 火山引擎 DataTester 应用故事:一个 A/B 测试,将产品 DAU 提升了数十万

      更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 疫情让线下的需求大量转移到线上,催生出了远程办公.网络授课.线上健身等新的生态现象.如何更好地为用户服务,提升 ...

  8. Snack3 3.1.10的新特性及应用

    <dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId& ...

  9. mit6.s081 lab1:Unix Utilities

    1 sleep(easy) 要求:为 xv6实现 UNIX 程序睡眠; 睡眠需要暂停一段用户指定的时间.刻度是由 xv6内核定义的时间概念,即定时器芯片两次中断之间的时间.解决的程序应该在 user/ ...

  10. 经典Python案例实现

    入门_30个常用python实现 .pdf 一. 二. 三. 四. 五.函数篇 5.1 计算圆的面积 from math import pi as PI def CircleArea(r): if i ...