遇到一个 Nginx 的诡异问题,求解答

2017-03-20 12:39:59 +08:00
 awanabe

还原场景:

Q : Nginx 是什么样的规则,把只有HTTPS访问的网站的非http请求导入到同 ip 下面的不同域名前缀的网站呢?

2430 次点击
所在节点    问与答
25 条回复
binghe
2017-03-20 12:45:21 +08:00
程序问题?
wevsty
2017-03-20 12:52:57 +08:00
搜索关键词 nginx tls sni
应该能帮到你
awanabe
2017-03-20 12:53:08 +08:00
@binghe 不是,简单判定下来就是 nginx 切换了目标网站
mingyi0
2017-03-20 12:58:59 +08:00
Q : Nginx 是什么样的规则,把只有 HTTPS 访问的网站的非 http 请求导入到同 ip 下面的不同域名前缀的网站呢?
如果你的 A 站改为 HTTPS 了,那么正常情况他的端口就变成了 443 ssl ,这时候你访问 HTTP 的 A 站,相当于访问 80 端口,但是 80 端口中已经没有 A 的 server name 了, nginx 会根据首字母排序默认访问第一个站,你服务器上就 A 、 B 两站,所以就会访问 B 站了。如果我建议你把 A 站的 80 做一个 rewrite 跳转,类似 rewrite ^(.*)$ https://$host$1 permanent;
awanabe
2017-03-20 13:41:43 +08:00
@mingyi0 不应该有 域名限制么?
awanabe
2017-03-20 13:49:23 +08:00
@wevsty 好像不是你说的这个问题。。
mingyi0
2017-03-20 14:34:25 +08:00
@awanabe 没有限制吧,比如你通过 IP 访问,现在默认也会跳到 B 站吧,可以看看文档: http://nginx.org/en/docs/http/server_names.html
msg7086
2017-03-20 15:15:20 +08:00
Nginx 下需要让一个网站同时监听 80 和 443 。你看看你是不是把 A 站里 80 端口监听去掉了。
msg7086
2017-03-20 15:17:07 +08:00
如果你需要 80 跳转 443 的:
server: listen 80; server_name A; rewrite 到 https;
server: listen 443 ssl; server_name A; A 站;
server: listen 80; server_name B; B 站;

你看看你是不是这么设定的,如果不是的话那应该就有问题了。
awanabe
2017-03-20 15:21:14 +08:00
@msg7086 是去掉了 A 站的 listen80 , 现在已经加上了 A 站的 80 , rewrite 到 443 了。
msg7086
2017-03-20 15:22:53 +08:00
@awanabe 如果将来一直用 HTTPS 访问的话,也可以顺手加上 HSTS ,这样就可以避免额外的跳转了。
awanabe
2017-03-20 15:24:38 +08:00
@mingyi0
@msg7086
问题是, 我以前配置多 servername 的时候,一般去掉 IP 的 listen80 , 防止 IP 被访问。
一般设置有 ip 会配置, default 选项, 是的流量在找不到 servername 的时候默认走 ip
只是我两个配置都没有 default , 也没有 ip default 配置, 那逻辑上应该每一个进来的 servername 都去找对应的配置,否则就 504 才对吧?
msg7086
2017-03-20 15:30:46 +08:00
@awanabe 504 是什么鬼。
要防止 IP 被访问的话,是要单独给 server_name 配一个 default 然后 return 403 之类的。
去掉 listen 80 的话,当然会漏给其他虚拟主机了。
ETiV
2017-03-20 15:32:13 +08:00
通常这么多人在回复但还没有解决问题,一般是 LZ 问题描述的不好

要不直接上配置吧
awanabe
2017-03-20 15:41:34 +08:00
@ETiV 又不是解决问题, 解决问题我早就搞定了, 一句话加上 rewrite 就行。
只是不懂 nginx 的 default server 规则。 所以你懂么?
awanabe
2017-03-20 15:43:36 +08:00
@msg7086 手滑,应该是 502 bad gateway 的错误才对吧?
403 是没有权限才对
5xx 是 server 内部错误
awanabe
2017-03-20 15:44:49 +08:00
@msg7086 那我的理解, 就是当 listen80 只有一个的时候其实就是 default server 了。。这个有点坑, 很容易就踩进去了。 本来以为 server name 就是用来去强制隔离的
msg7086
2017-03-20 15:46:51 +08:00
@awanabe 502 只有在 proxy_pass 的对象无法访问的时候才会出现。
你这种情况要炸也只会炸 500 。
这里 Nginx 找不到匹配的 server_name ,也没有 default 的情况下,默认是漏给第一个 server 块(也即意味着第一个块是 catch-all 块)。你网站上只有 A 和 B ,没了 A ,这个端口上只剩 B ,当然就漏去 B 了。
awanabe
2017-03-20 16:07:04 +08:00
@msg7086 嗯,应该就是这样的规则,踩了坑,所以做切换还是提醒自己,把 http rewrite 到 https 上去
lan894734188
2017-03-20 16:14:03 +08:00
https 要设成监听 80 443

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

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

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

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

© 2021 V2EX