新版本 nginx 中的正确方法

新版本 nginx 中的正确方法

我想将我的 Web 服务器上的所有 http 请求重写为 https 请求,我从以下内容开始:

服务器 {
    听80;

    地点 / {
      重写 ^(.*) https://mysite.com$1 永久;
    }
...


一个问题是,这会剥离任何子域信息(例如,node1.mysite.com/folder),我该如何重写上述内容以将所有内容重新路由到 https 并维护子域?

答案1

新版本 nginx 中的正确方法

事实证明,我对这个问题的第一个回答在某个时候是正确的,但它变成了另一个陷阱——要保持最新状态,请查看重写陷阱

许多 SE 用户已经纠正了我,因此功劳归于他们,但更重要的是,这是正确的代码:

server {
       listen         80;
       server_name    my.domain.com;
       return         301 https://$server_name$request_uri;
}

server {
       listen         443 ssl;
       server_name    my.domain.com;
       # add Strict-Transport-Security to prevent man in the middle attacks
       add_header Strict-Transport-Security "max-age=31536000" always; 

       [....]
}

答案2

注意:最好的方法是https://serverfault.com/a/401632/3641- 但这里重复一下:

server {
    listen         80;
    return 301 https://$host$request_uri;
}

在最简单的情况下,您的主机将被固定为您想要将它们发送到的服务 - 这将对浏览器执行 301 重定向,并且浏览器 URL 将相应更新。

下面是之前的答案,由于正则表达式,它效率低下,一个简单的 301 就很好,如 @kmindi 所示

我一直使用 nginx 0.8.39 及以上版本,并使用以下内容:

 server {
       listen 80;
       rewrite ^(.*) https://$host$1 permanent;
 }

向客户端发送永久重定向。

答案3

我认为最好的也是唯一的方法应该是使用HTTP 301 已永久移动像这样重定向:

server {
    listen         [::]:80;
    return 301 https://$host$request_uri;
}

HTTP 301 已永久移动重定向也是最有效的,因为没有需要评估的正则表达式,根据已经提到的陷阱


新的HTTP 308 已永久移动保留请求方法,并且主流浏览器均支持例如,使用可防止浏览器将重定向请求的308请求方法从 更改POST为。GET


如果你想保留主机名和子域这就是方法。

如果没有 DNS,仍然可以工作,因为我也在本地使用它。例如,我使用 进行请求,http://192.168.0.100/index.php并且将被重定向到https://192.168.0.100/index.php

listen [::]:80在我的主机上使用是因为我已经bindv6only设置为,所以它也绑定到 ipv4 套接字。如果您不想要 IPv6 或想要绑定到其他地方,false请将其更改为。listen 80

Saif Bechan 的解决方案使用了server_name我的情况下是本地主机但无法通过网络访问。

Michael Neale 的解决方案很好,但是根据缺陷,有一个更好的解决方案,即重定向 301;)

答案4

由于一直在创建新的子域名,因此上述方法不起作用。例如 AAA.example.com BBB.example.com 有大约 30 个子域名。

最终得到了一个可运行的配置:

server {
  listen 80;
  server_name _;
  rewrite ^ https://$host$request_uri? permanent;
}
server {
  listen  443;
  server_name example.com;
  ssl on;
  ssl_certificate /etc/ssl/certs/myssl.crt;
  ssl_certificate_key /etc/ssl/private/myssl.key;
  ssl_prefer_server_ciphers       on;
# ...
# rest of config here
# ...
}

相关内容