如果仅请求 server_name,如何不重定向

如果仅请求 server_name,如何不重定向

大多数人在浏览器栏中输入: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 块。

相关内容