一般项目上常用Nginx做负载均衡和静态资源服务器,本案例中项目上使用Nginx作为静态资源服务器出现了很奇怪的现象,我们一起来看看。

“诡异”的现象

部署架构如下图,Nginx作为静态资源服务器监听8080端口,客户浏览器通过API网关的443端口(就是https)获取Nginx静态资源。

现象是用户浏览器访问API网关的https地址后,API网关将请求SSL解密再请求Nginx 50001端口的/hd-portal路径,但返回给客户端的却是 https://a.com:50001/hd-portal/ !!! 这还是个重定向响应,响应头里包含 Location: https://a.com:50001/hd-portal/,由于API网关并没有开放这个端口号,所以请求到这里就无法继续下去了。

问题分析

笔者是同事拉进线上会议看的这个问题,大家已经琢磨好一会了,我让同事复现了下现象,也试着调了几个nginx.conf的参数没有奏效,赶上快中午了,就让同事用tcpdump抓下Nginx服务器网络包,我开始Wireshark分析。(常规定位Nginx的问题有两个办法:看access.log判断问题 和 tcpdump抓包分析确定问题。看access.log没看出那个50001是谁返回的)

这里就很明确是Nginx返回的301永久重定向,Nginx使用自己端口号暴露出来做的重定向。到此问题已清晰,只要不让Nginx把端口号暴露出来就可以了。

问题原因

这得先从Nginx的处理流程说起。

案例中,我们请求的是 https://API网关/hd-portal ,Nginx收到请求发现 /hd-portal 是一个目录,就会设置响应头Location 和空的响应体,试图让浏览器以目录方式访问资源。而浏览器收到响应后,解析响应头发现 Location 响应头确定要重定向,就开始跳转 https://API网关/hd-portal/

以上是正确合理的情况,不合理的点在于:Nginx为啥把自己端口号暴露出来了?

经过查询了Nginx官方文档,发现了三个有联系的配置项,分别贴图出来:

这三个配置分别是 absolute_redirect / server_name_in_redirect / port_in_redirect,以下简要说明下三者作用:

  • absolute_redirect:启用时表示绝对路径重定向,默认on启用
  • server_name_in_redirect: 启用时表示使用Nginx的server_name配置替换重定向路径,默认off禁用
  • port_in_redirect:启动时表示重定向时替换重定向的端口号,默认on启用
  • 这三个配置关系中,如果absolute_redirect配置off,则后两个配置失效。

解决方案

至此,可以有两种解决方案,根据实际情况任选其一即可:

  • absolute_redirect配置 off(禁用绝对路径跳转,相当于自动识别目录)
  • port_in_redirect配置 off(禁止替换重定向端口号)

这两个方案的配置位置可以是http / server / localtion块,作用范围也是根据配置位置决定的。

至于本案例中,由于多个项目使用同一个server,就在location块中添加了 port_in_redirect: off; 解决了问题。

总结

本文试图从问题现象到分析与解决方案的提出让读者能对Nginx的301重定向做到心中有数,相信读者看完本文再出现类似的问题解决起来肯定更轻松愉快!

我是Hellxz,如果本文对您有所帮助,请点个赞再走呗!~

【问题解决】 网关代理Nginx 301暴露自身端口号的更多相关文章

  1. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  2. nginx反向代理出现了代理的端口号

    nginx反向代理显示了代理的端口号 nginx反向代理配置文件 upstream mall { server 1.1.1.1:10261 weight=1; } server { listen 80 ...

  3. 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法

    不知道你有没有遇到过这样的问题,网站访客多起来后,心里很是高兴,加上了Nginx反向代理,出问题了 原来是这么写的: Request.Url.ToString() 输出是这样的: http://www ...

  4. 【虚拟机-网关】如何在使用应用程序网关和 Nginx 的环境下实现强制 HTTPS 跳转

    背景介绍 大家在使用 Nginx 部署网站时,实现 HTTP 到 HTTPS 的强制跳转是非常容易的事情,一般可以使用rewrite 命令或者使用返回自定义 301 页面的方法对 HTTP 请求进行 ...

  5. 网关中间件-Nginx(二)

    网关中间件-Nginx(一) 第一部分我们主要介绍如下几点: 1.nginx的基本概念 2.nginx结合业务场景实现负载均衡 3.常见问题的举例 这一部分主要介绍Nginx中限流,缓存,动静分离,以 ...

  6. nginx反向代理nginx,RealServer日志打印真实ip

    title: nginx反向代理nginx,RealServer日志打印真实ip date: 2016-05-11 19:15:37 tags: --- nginx反向代理nginx,RealServ ...

  7. 【修改端口号】linux下修改apache,nginx服务端口号

    一.linux下修改apache端口号 yum安装后,apache配置文件: /etc/httpd/conf/httpd.conf 找到apache目录下的 httpd.conf, 使用vi 打开,找 ...

  8. nginx 301 302跳转配置总结

    首先看简单的代码示例,关于nginx 301 302跳转的. 301跳转设置: server { listen 80; server_name 123.com; rewrite ^/(.*) http ...

  9. nginx只允许移动端访问( 判断拦截pc浏览器访问)

    set $mobile_request '0'; if ($http_user_agent ~* (Android|webOS|iPhone|iPod|BlackBerry)) { set $mobi ...

  10. 20190418 CentOS7实用技能综合:系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/RocketMQ/RabbitMQ编译安装 + ...各类常用生产环境软件的编译安装

    系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/Roc ...

随机推荐

  1. 我和 chatGPT 对线操作系统!

    大家都知道现在 chatGPT 已经在多个领域展现了及其强大的工地,比如文案策划,毕业论文方便,甚至很多程序员都直接让 chatGPT 帮忙写代码了,在一些模板化的代码方面,chatGPT 更展示了优 ...

  2. python入门教程之四基本语法

    1Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大 ...

  3. Java中「Future」接口详解

    目录 一.背景 二.Future接口 1.入门案例 2.Future接口 三.CompletableFuture类 1.基础说明 2.核心方法 2.1 实例方法 2.2 计算方法 2.3 结果获取方法 ...

  4. React框架使用

    一:使用Vite创建React项目 二:React中组件使用 import React, { Component, useState } from "react"; //使用cla ...

  5. API Gateway vs Load Balancer:选择适合你的网络流量管理组件

    本文从对比了 API Gateway 和 Load Balancer 的功能区别,帮助读者更好地了解他们在系统架构中扮演的角色. 作者陈泵,API7.ai 技术工程师. 原文链接 由于互联网技术的发展 ...

  6. 理解Java程序的执行

    main 方法 public class Solution { public static void main(String[] args) { Person person = new Person( ...

  7. Django框架——可视化界面之数据增删改查、Django请求生命周期、Django路由层、反向解析

    可视化界面之数据增删改查 针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取 在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看 ''' form表单中能够触发调剂动 ...

  8. PostgreSQL-HA 高可用集群在 Rainbond 上的部署方案

    PostgreSQL 是一种流行的开源关系型数据库管理系统.它提供了标准的SQL语言接口用于操作数据库. repmgr 是一个用于 PostgreSQL 数据库复制管理的开源工具.它提供了自动化的复制 ...

  9. 2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器,假设选的是第i台, 那小美可以将其变成

    2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1.a2.-.an, 小美每次操作可以选其中的一台机器,假设选的是第i台, 那小美可以将其变成 ...

  10. npm init vite@latest; 项目名字是abcde,选了vue-ts; cd abcde; npm install; npm run dev;浏览器访问,结果是空白的,这是怎么回事?

    npm init vite@latest 项目名字是abcde,选了vue-ts cd abcde npm install npm run dev 浏览器访问,结果是空白的,这是怎么回事? 后来发现是 ...