网页多次重定向问题

问题描述

访问链路: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 则用于控制重定向时主机名的选择。

相关推荐
白菜欣4 小时前
Linux — 进程控制
android·linux·运维
JoneBB5 小时前
ABAP Webservice连接
运维·开发语言·数据库·学习
Tolalal6 小时前
Vmware Ubuntu虚拟机扩容
linux·运维·ubuntu
咚为6 小时前
比AccessLog更全面的原生Nginx 日志记录
运维·nginx·junit
我星期八休息6 小时前
Linux系统编程—基础IO
linux·运维·服务器·c语言·c++·人工智能·算法
a752066286 小时前
零基础实操:小龙虾 AI OpenClaw 接入 Kimi 详细步骤
运维·服务器
Goldbioinformatics7 小时前
Windows版Claude Cowork启动Linux问题
linux·运维·windows
念恒123067 小时前
Ext系列文件系统(下)
linux·运维·服务器
布吉岛的石头8 小时前
Docker Compose编排实战:多容器应用从开发到生产
运维·docker·容器