结合重写条件

我必须在nginx中结合两个规则:

(1)如果主机不是www.host.deredirect到www.host.de

(2)如果协议是HTTPredirect到https

我目前的解决scheme首先更改为www,并在下一个请求更改为https。 这意味着我有多个redirect。

我试图把它减less到一个redirect。 我的规则:

 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; } 

我试图通过使用variables重写参数来解决这个问题(因此我要求在一个variables中存储正则expression式)。

我如何优化redirect,这样我就不会有两个客户端redirect?

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 ... ... } 

为了解决这个问题,我们可以把条件分解成服务器块…

 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 } 

解决scheme并不像人们期望的那么短。 但是,它仍然做的工作!