我想将我的 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
# ...
}