网页多次重定向问题

问题描述

访问链路: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 在构造重定向地址时,可能会把内部感知到的 http18088 一并返回给客户端,进而导致客户端发生异常跳转。

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

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

相关推荐
虎头金猫14 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
还是大剑师兰特14 小时前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
AI职业加油站15 小时前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏16 小时前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
xing-xing16 小时前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅17 小时前
linux(8) 软硬链接
linux·运维·服务器
张洛闻Eren17 小时前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
其实防守也摸鱼17 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
布裘18 小时前
【银河麒麟】V4桌面图标消失,右击鼠标没反应排查
运维·银河麒麟·桌面环境
懂软件的胡子个哥18 小时前
微信机器人为什么需要“回复候选”而不是所有 AI 内容直接发送
运维·微信·自动化·wechatapi·个人微信号二次开发