网页多次重定向问题

问题描述

访问链路:Client ---https(443)---> CLB ---http(18088)---> Nginx

当请求访问的是目录,而又没有主动在URL带/时,Nginx会加上/并返回让浏览器重新请求一次,这时候重定向的Location可能与预期不符。

具体现象为,当访问 test.example.com/haha 时,先发生一次 301 Moved Permanently ,接着发生一次 307 Temporary Redirect地址变更为 test.example.com:18088/haha/ ,最后再用 test.example.com:18088/haha/ 访问。

根因分析

当 CLB 终止 HTTPS、并以 HTTP 转发到后端 Nginx(如 18088 端口)时,如果 Nginx 触发了由其生成的重定向,默认可能会按当前请求在 Nginx 看来 的协议、主机、端口与目标 URI 组装出一个绝对的 Location 返回给客户端。因此在该链路下,Location 里可能会出现 http 以及后端监听端口,而不是客户端最初访问时使用的 HTTPS 信息。这一点可以从日志也可以确认

arduino 复制代码
100.122.21.71 - test.example.com "GET /haha HTTP/1.1" 301 "https" "http" "http://test.example.com:18088/haha/"

日志字段内容参考

dart 复制代码
log_format debug  '$remote_addr - $host "$request" $status '
                  '"$http_x_forwarded_proto" "$scheme" "$sent_http_location"';

该行为是由 absolute_redirect 控制,并默认设置为on,若设置为 off ,当重定向发生时只会返回相对Location。

问题的根因在于 Nginx 发生重定向时默认返回的是绝对 Location,其中会包含协议、主机、端口和 URI。由于当前链路中 CLB 到后端 Nginx 使用的是 HTTP,且 Nginx 监听的是自定义端口 18088,所以 Nginx 在构造重定向地址时,可能会把内部感知到的 http 和 18088 一并返回给客户端,进而导致客户端发生异常跳转。

因此,可以考虑关闭 absolute_redirect 。这样当重定向发生时,Nginx 返回的将是相对路径,而不是包含协议、域名和端口的绝对路径,从而避免将后端内部链路信息暴露给客户端,也能规避这类跳转异常问题。

如果问题只是在重定向时把 Nginx 的监听端口带给了客户端,可以考虑调整 port_in_redirect。该参数默认是 on,用于控制 Nginx 发出的绝对重定向 中是否带端口。server_name_in_redirect 则用于控制重定向时主机名的选择。

相关推荐
Decay__19 分钟前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
贞明电子2 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
万联WANFLOW3 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
Ruiery5 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
Decay__6 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
江华森7 小时前
数据中心基础设施运维实战:概述与实验环境搭建
运维
迪菲赫尔曼8 小时前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测
by209999 小时前
Linux GCC/G++ 编译与 Makefile 构建
linux·运维·服务器·经验分享
螺丝钉tina9 小时前
[Playwright][08] Upload 模块自动化:如何设计真实业务测试用例?
运维·自动化·测试用例
迪菲赫尔曼9 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测