我必须在 nginx 中结合两个规则:
(1)如果主机没有www.host.de
重定向到www.host.de
(2)如果协议是 HTTP,则重定向到 https
我当前的解决方案首先更改为 www,然后在下一个请求时更改为 https。这意味着我确实有多个重定向。
我尝试将其减少到一次重定向。我的规则:
server_name .host.de;
set $wanted_domain_name www.host.de;
if ($http_host != $wanted_domain_name) {
rewrite ^(.*)$ $scheme://$wanted_domain_name$1;
}
if ($scheme != "https") {
rewrite ^ https://$host$uri permanent;
}
我尝试通过使用变量重写的参数来解决这个问题(因此我要求将正则表达式存储在变量中https://serverfault.com/questions/812670/store-regex-in-variable)。
我该如何优化重定向,以便不会有两次客户端重定向?
答案1
不要使用if
s。
使用单独的服务器块。
server {
listen 80;
server_name .example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name .example.com;
# ... ssl stuff ...
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
# ... ssl stuff ...
...
}
答案2
为了解决这个问题,我们可以将条件分成服务器块......
server {
listen 80;
server_name www.example.com;
location / {
return 301 https://www.example.com$request_uri;
}
}
server {
listen 80;
listen 443 ssl;
server_name .example.com;
# ssl_certificate ...;
# ssl_certificate_key ...;
location / {
return 301 https://www.example.com$request_uri;
}
}
server {
listen 443 ssl;
server_name www.example.com;
# ssl_certificate ...;
# ssl_certificate_key ...;
# do whatever stuff you wish here
}
该解决方案并不像人们期望的那样简短。但是,它仍然可以完成工作!