在配置 Nginx 做 IP 到域名跳转的时候,你可能会遇到一个非常诡异的场景:
- 用浏览器访问服务器的 IP 地址,希望它自动跳转到你的域名;
- 在大多数浏览器(如 Firefox、Edge)或设备上测试都没问题;
- 唯独你自己的 Chrome 浏览器不跳转,而是直接访问了
https://<IP>
; - 更奇怪的是,用其他电脑上的 Chrome 浏览器访问,反而是正常的!
本文将详细介绍这个问题的成因和解决方法。
❓问题复现
假设你在 Nginx 中配置如下逻辑:
server {
listen 80 default_server;
server_name _;
rewrite ^(.*)$ https://www.quantverse.top permanent;
}
你希望所有通过 IP 的访问(http://<IP>
)自动重定向到你配置好的域名 https://www.quantverse.top
。
但在自己的 Chrome 上访问 IP,却直接跳到了 https://<IP>
,完全没走上面的重定向规则。
⚠️ 根本原因:Chrome 的 HSTS 缓存机制
这个问题的罪魁祸首是 —— Chrome 的 HSTS 缓存(HTTP Strict Transport Security)。
什么是 HSTS?
HSTS 是一种安全机制,一旦网站启用了它,浏览器就会记住这个站点需要强制使用 HTTPS。
- 例如你访问了
http://123.123.123.123
,并收到了带有Strict-Transport-Security
的响应头; - Chrome 会记录下这个 IP;
- 之后你即使再输入
http://123.123.123.123
,Chrome 会直接帮你升级成https://123.123.123.123
,压根不会发送 HTTP 请求。
所以发生了什么?
你写的 Nginx 配置只处理了 http://<IP>
请求(因为那是 listen 80
),但是浏览器根本没发 HTTP 请求就跳到了 HTTPS,导致你的重定向完全无效。
✅ 解决方案一:清除 Chrome 的 HSTS 缓存(推荐)
- 打开地址栏输入:
chrome://net-internals/#hsts
- 滚动到 “Delete domain security policies” 部分。
-
在文本框中输入你的服务器 IP 地址,例如:
123.123.123.123
- 点击 “Delete”。
-
然后重新访问 IP 地址,应该就能跳转到你的域名了。
🎉 成功! 这说明确实是本地 HSTS 缓存导致的问题。
✅ 解决方案二:为 IP 的 HTTPS 请求加一份 Nginx 配置(更彻底)
为了避免未来再次出现这个问题,建议在 Nginx 中为通过 IP 访问的 HTTPS 请求加一份 default_server
的监听逻辑:
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /usr/local/nginx/ssl/quantverse.top_cert_chain.pem;
ssl_certificate_key /usr/local/nginx/ssl/quantverse.top_key.key;
# 强制重定向到域名
rewrite ^ https://www.quantverse.top$request_uri? permanent;
}
这样就能保证无论用户怎么访问 IP(HTTP / HTTPS),都能被重定向到你设定的域名。
🧠 延伸阅读:如何设置自己的 HSTS 策略?
如果你想主动使用 HSTS 来提升网站安全性,可以在域名配置中加上类似这样一行:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
这会让访问你域名的浏览器自动记住「以后只能用 HTTPS 访问」,但要注意 不要对 IP 加这个头!
📝 总结
问题 | Chrome 访问 IP 不跳转到域名 |
---|---|
根因 | 本地缓存了该 IP 的 HSTS 策略,自动升级 HTTP 为 HTTPS |
快速解决 | 删除本地 HSTS 缓存 |
彻底解决 | 为 IP 的 HTTPS 请求单独加一份 Nginx 配置做跳转 |
如果你也遇到了类似的问题,不妨试试上面的两个方案,基本可以彻底解决 Chrome 的顽固重定向问题。如果你觉得这篇文章对你有帮助,欢迎转发、点赞、收藏~
发表回复