请教一个 Nginx 配置和浏览器强制 http 转 https 问题

201 天前
 coolair
在 Nginx 配置了多个站点的情况下,如果有些站点没有启用 https (使用了通配符证书),而有些启用了 https 的话。

在浏览器中访问没有启用 https 的域名,会强制跳转到 https ,导致解析到启用了 https 的网站,而不是自己 http 的网站。

这个有没有办法在不修改客户端浏览器的情况下解决?
3147 次点击
所在节点    NGINX
15 条回复
tars13344
201 天前
这是浏览器的 HSTS 策略,没啥好办法 只能都配 https
lpe234
201 天前
不应该啊 我一般是在 `conf.d` 目录下一个项目一个配置文件。 如: `xxx.xx.conf`

upstream home {
server 127.0.0.1:28090;
}

server {
listen 80;
server_name xxx.xxx;

rewrite ^ https://$http_host$request_uri? permanent; # force redirect http to https
}

server {
listen 443 ssl http2;
server_name xxx.xxx;

index index.html;
root /mnt/www/xxx.xxx;

location / {
proxy_pass http://home;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

并不会出现你说的这个问题
totoro625
201 天前
"如果有些站点没有启用 https (使用了通配符证书)"
想看一下这个站点是怎么配置的,初步判断是这里出了问题

没有启用 https 就不要配置证书,没有配置证书就是一个正常的 http 站点

排除方式:使用一个全新的浏览器环境,直接访问 http 站点,看一下是否存在问题
yulgang
201 天前
强制跳转到 https 是浏览器行为。

我猜测他是先尝试连 443 端口,你可以把服务器 443 端口临时关了试一试

如果你的服务器可以联网的话,可以考虑使用比如 let's encrypt 这样的免费证书,acme.sh 可以自动签发 reload nginx 的
coolair
201 天前
@totoro625 #3 是不是通配符证书导致的?
lneoi
201 天前
看意思是 https 是配全局了,每个站点分开来配应该就行了吧
另一种统一入口的话,nginx 内部代理一下可以将 https 代理到 http
coolair
201 天前
@yulgang #4 使用的自动签发的证书
zhanlanhuizhang
201 天前
你 nginx 配置错误了吧,我的也是你这样的,没有问题呀。
lslqtz
201 天前
ssl 建议有一个默认块来兜底全部请求 (包括非 https 网站的).
jiangzm
201 天前
https 请求跳转到另一个 https 站点,100%是 nginx 配置问题, 这个看配置就知道问题在哪

你的 A 站只启用了 http 但是当前 ip 有 443 端口,你访问 A 域名的 https 肯定是能接收到请求的, 正确做法是所有的 https server_name 都指定具体域名不要写通配域名“*.xx.com”也不要兜底的"_"。

这样访问 A 站肯定没有 https 服务了。
Akasoent
201 天前
配置文件脱敏后发出来。
Xheldon
201 天前
> 我发现问题是,当访问一个没配置 ssl 的域名时,比如:访问 https://a.test.com ,但是它没有配置 ssl ,那么就会跳转到配置了 ssl 的一个站点去。

Nginx 的匹配是顺序匹配的,80 端口没匹配到就跑下面的 443 规则了,如果没有就会返回最后一个兜底的链接而不管 server_name 是什么,你可以试试
kenshin912
201 天前
我大概看懂了 OP 的意思 .
在一个配置了多个虚拟主机配置文件的 Nginx 中 , 当请求某个只配置了 HTTP 的站点时 , 由于浏览器默认访问 HTTPS , Nginx 返回了另一个 HTTPS 的站点 , 这样就存在一些安全问题 , 是吗 ?

我这里是这么做的 , 在 Nginx.conf 中修改默认配置 , 启用 ssl_reject_handshark .

```nginx
######################## default ############################

geo $public_ip {
default 1;
127.0.0.0/8 0;
10.0.0.0/8 0;
172.16.0.0/16 0;
}

server {
server_name _;
#listen 80 default_server;
listen 443 ssl default_server;

ssl_reject_handshake on;

if ($public_ip) {
return 444;
}

error_page 400 494 495 496 497 =444 /;

root /xxx/xxxx/default;
index index.html;

}

```
coolair
201 天前
@kenshin912 #13 感谢,就是这个意思,哈哈,太棒了,解决了。
kenshin912
200 天前
@coolair #14 很高兴能帮到你.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1110841

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX