出现的问题:
我在nginx中配置了多个门户网站,有配置https的和http网站的。在启动后一切访问都是正常的,但在百度抓取时就不正常了,本来抓取http网站时,却抓取了https的内容。然后我经过尝试将http网站用https的方式访问,居然能呈现出https网站内容。
这就让我感觉不可思议了,案例来说,我配置的是http网站,如果用https应该无法访问才对的。
原因:
原理:在nginx配置多个server时,如果http网站采用https访问时,nginx由于匹配不到https所以就会重定向转发为当前服务器IP:443进行访问,从而从本地nginx中进行查找443的serve,注意:此时已经重定向了,server_name的限制已经不存在了,只查找ip:443的网站,如果没有显式声明 default server 则第一个 server 会被隐式的设为 default server。
访问流程:
- 匹配网址和访问类型,如果都能匹配上,则返回
- 类型匹配不上,则由nginx进行转发当前ip:443
- nginx匹配当前默认的443网站,如果没有配置则查找第一个443网站内容进行返回
解决办法:
提示:配置一个默认的https 也就是http ssl 443 default_server,只要不是相同类型访问的,统一都访问到当前server去,并且可以直接return 500
例如:
server {
listen 80 default_server;
listen 443 ssl http2;
server_name _;
return 403; # 403 forbidden
}
当然也可以直接给http网站配置一个SSL证书进去,这样也不会出现这种情况了。
至于获取免费的SSL证书和配置可查看:链接: 证书获取和配置