合并重写条件

合并重写条件

我必须在 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

不要使用ifs。

使用单独的服务器块。

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
}

该解决方案并不像人们期望的那样简短。但是,它仍然可以完成工作!

相关内容