大多数人在浏览器栏中输入:mysite.com
而不是https://mysite.com
。
很多开发人员(包括我自己)在他们的 Nginx 配置文件中都有类似这样的内容,这意味着这个mysite.com
请求会导致网站redirect
出现以下问题https://
:
server {
listen 80;
server_name mysite.com;
return 301 https://$server_name$request_uri;
}
Google Pagespeed 团队最近表示[参考]这些重定向对于性能来说非常糟糕,特别是在移动设备上,因为这redirect
会导致请求通过移动运营商网络返回。
我的问题是,有没有其他方法可以编写 nginx.conf,以便输入的人server_name
不会遇到这种http://
重定向https://
惩罚?
答案1
不,这需要您更改浏览器的行为。一切都基于请求响应。用户example.com
在浏览器栏中键入内容,浏览器会自动http://
在其前面添加内容。因此,您的服务器将始终获得第一个请求,http://example.com
并且如果没有 SSL,您只能通过重定向到启用 SSL 的地址来响应。
拒绝请求,正如 Nathan 所建议的那样,绝对不是一个选择。因为浏览器会显示一个错误页面,提示该网站无法访问,甚至可能不存在。
但你还可以做其他事情:HTTP 严格传输安全 (HSTS)
https://
HSTS 会告知浏览器你的网站只能通过 SSL 访问,并且后续请求应始终使用而不是自动完成http://
。你可以在 nginx 中使用 SSL 服务器块中的以下几行来实现这一点:
add_header Strict-Transport-Security "max-age=262974383";
http {
# One server listening on port 80 and sending the redirect to HTTPS
server {
server_name example.com;
return 301 https://$server_name$request_uri;
}
# Our actual server handling incoming requests.
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/my_site.pem;
ssl_certificate_key /etc/ssl/my_site.key;
# Tell the browser that he should always visit us with SSL.
add_header Strict-Transport-Security "max-age=262974383";
}
}
答案2
要么不监听端口 80(这将引发错误),要么拒绝请求:
server {
listen 80;
server_name mysite.com;
location / {
deny all;
}
}
然后就得到正常的 443 块。