适用场景:多端口、多协议(HTTP / HTTPS)、反向代理环境下出现端口泄露、异常跳转、浏览器与 curl 行为不一致的问题。
1. 问题现象
https://xxx.com/v2
http://xxx.com:11080/v2/
curl -I https://xxx.com/v2
返回:
Location: /v2/
结论:当前 443 Nginx 配置是正常的,:11080 并非服务器实时返回。
2. 核心结论(先记住)
-
curl:
- 无缓存
- 无 HSTS
- 无历史重定向
- 只反映当前服务器真实行为
-
浏览器:
- 有历史
- 有 HSTS
- 会记住 301 / 308
- 会在发请求之前执行本地跳转规则
问题根源在浏览器侧的历史状态,而不是当前 Nginx 响应。
3. 为什么「点击链接」≠「地址栏输入」
3.1 从其它应用点击链接
路径:
第三方应用 → 操作系统 → 浏览器已有 Profile
行为特征:
-
复用已有窗口 / Tab
-
直接套用历史规则:
- HSTS
- 永久重定向(301 / 308)
- 端口 / scheme 记忆
-
可能在真正发请求前就完成跳转
表现为:
- Network 面板不完整
- Nginx 日志里没有对应请求
3.2 浏览器地址栏手动输入并回车
这是浏览器的 Typed Navigation(最高优先级):
- 严格尊重用户输入的 scheme / host / port
- 更倾向重新向服务器发起请求
- 行为更接近
curl
因此:
4. HSTS 机制说明
4.1 HSTS 是什么
当浏览器收到:
Strict-Transport-Security: max-age=31536000
含义是:
- 在
max-age 秒内
- 该域名 只能使用 HTTPS
- 浏览器会在本地直接改写请求
- 不会再询问服务器
4.2 HSTS 会自动更新吗?
结论:几乎不会。
原因:
- 每一次成功的 HTTPS 响应都会刷新
max-age
- 倒计时永远走不到 0
只有以下情况才会消失:
- 用户长时间完全不访问该域名
- 或服务器通过 HTTPS 明确下发:
Strict-Transport-Security: max-age=0
5. :11080 是如何被“记住”的
典型历史时间线:
-
曾存在错误配置(哪怕很短时间):
listen 11080 default_server
absolute_redirect on
- 错误的
rewrite 或 proxy_redirect
-
浏览器收到永久跳转:
Location: http://xxx.com:11080/v2/
-
浏览器将其写入本地跳转规则
-
即使服务器后来修复,浏览器仍会:
6. proxy_redirect 机制总结
6.1 proxy_redirect 的默认行为
在反向代理场景:
Client → Nginx(443) → Backend(11080)
若后端返回:
HTTP/1.1 302 Found
Location: http://backend:11080/v2/
Nginx 默认会:
- 改写
Location
- 使用
$scheme + $host + 当前 listen 端口
- 生成对外的绝对跳转地址
6.2 proxy_redirect off 的含义
proxy_redirect off;
等价于:
上游返回什么,我一字不改
效果:
- 不拼端口
- 不补 scheme
- 不改写 Location / Refresh
6.3 proxy_redirect 与 absolute_redirect 区别
| 指令 |
控制对象 |
| proxy_redirect |
上游返回的重定向 |
| absolute_redirect |
Nginx 自己生成的重定向 |
在复杂环境中,通常 两者都应关闭。
7. 推荐的稳定配置策略
7.1 对外只暴露 443
server {
listen 443 ssl;
server_name xxx.com;
}
7.2 非对外端口不参与 HTTP 语义
server {
listen 11080;
return 444;
}
7.3 关闭自动重写行为
proxy_redirect off;
absolute_redirect off;
8. 排查与验证方法
- 使用无痕窗口访问
- 使用新浏览器 / 新设备
- Chrome 清理 HSTS:
chrome://net-internals/#hsts
若无痕环境正常,则可确认问题在浏览器历史。
9. 工程经验总结
-
浏览器会记住错误的永久跳转
-
服务端修复 ≠ 客户端立刻恢复
-
多端口 / 多协议环境中:
curl 看到的是“现在的真相”,浏览器执行的是“过去的因果”。