就重定向了一下,该S的端口号哪里来的?

项目要上线,部署时链接突然多出个端口号?别着急,今天咱们来讲讲实际生产环境产生的一个Nginx重定向多出个端口号的问题。

场景描述:

在生产环境,我们申请了一个域名,通过TGW(负载均衡)到我们的前置Nginx服务。但是业务在这里有一个鉴权逻辑,需要我们跳转到业务方,由他们去微信鉴权然后重定向回到我们系统。大概流程如下图:
在这里插入图片描述
假设我们申请了域名 www.xxxx.com,端口:8443。 当这个鉴权完成之后,它跳转回来的URL变成了:
https://www.xxxx.com:8443/path?aaa=xxx
而我们预期的路径是:
https://www.xxxx.com/path?aaa=xxx

问题定位:

这真是一个神奇的问题,到底哪里出了问题呢。从链路上分析,用户访问地址 – TGW – Nginx前置服务 – 业务方 – 重定向 – TGW – Nginx前置服务
端口号我只在Nginx配置中写了,所以,加上端口号,应该是Nginx这里出了问题。
先看一下我们的Nginx配置:

  upstream test-server{
        server 156.121.23.56:3003;
  }
  server {
        client_max_body_size 10M;
        listen    8443;
        location /path {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_pass http://test-server;
        }
  }

如果是直接访问,并无不妥。问题是重定向这个过程,会先经过RS,再到Nginx前置服务。在不知道其他解决办法的情况下,百度无果,Google无望。只能去看官方API。

解决方法:

直接去官方文档中搜索port,有60多个结果,其中有一个结果引起了我的注意 :port_in_redirect

Syntax: port_in_redirect on | off;
Default: port_in_redirect on;
Context: http, server, location
Enables or disables specifying the port in absolute redirects issued by nginx.

The use of the primary server name in redirects is controlled by the server_name_in_redirect directive.

是什么意思呢,默认这个开关是打开的,也就是会带端口号,翻译过来就是:

启用或禁用Nginx 发出的绝对重定向中指定端口 。

重定向中主要服务器名称的使用由server_name_in_redirect指令控制。

那server_name_in_redirect这个又是什么东东?继续往下看:

Syntax: server_name_in_redirect on | off;
Default: server_name_in_redirect off;
Context: http, server, location
Enables or disables the use of the primary server name, specified by the server_name directive, in absolute redirects issued by nginx. When the use of the primary server name is disabled, the name from the “Host” request header field is used. If this field is not present, the IP address of the server is used.

The use of a port in redirects is controlled by the port_in_redirect directive.

Google翻译如下:

在nginx发出的绝对重定向中 启用或禁用由server_name指令指定的主服务器名称 。禁止使用主服务器名称时,将使用“主机”请求标头字段中的名称。如果不存在此字段,则使用服务器的IP地址。

重定向中端口的使用由port_in_redirect指令控制。

所以,我大概知道了,这个东西跟server_name_in_redirect没多大关系,它默认是关闭的,而port_in_redirect默认是打开的,也就是说重定向的时候默认是会带端口号,那如果我去掉呢?

去掉后配置如下:

  upstream test-server{
        server 156.121.23.56:3003;
  }
  server {
        client_max_body_size 10M;
        listen    8443;
        port_in_redirect  off;
        location /path {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_pass http://test-server;
        }
  }

果然,成功去除了端口号,地址为https://www.xxxx.com/path?aaa=xxx ,在上线的紧要关头遇到这个问题真的是急S人啊,好在最后解决了问题。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洲上牧童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值