如何将所有 HTTP 请求重定向到 HTTPS 并将所有不存在的子域重定向到一个特定域

如何将所有 HTTP 请求重定向到 HTTPS 并将所有不存在的子域重定向到一个特定域

我已经有一个有效的配置,可以将所有不存在的子域重定向到特定域。现在我想添加一个配置,将所有 HTTP 请求重定向到同一域上的 HTTPS。

该配置文件执行子域名重定向:

# redirect any non-existent subdomain (blah.domain.de -> domain.de)
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://domain.de$request_uri;
}

这是我尝试用于 HTTP->HTTPS 的配置:

# redirect any HTTP request to its HTTPS address (http://domain.de/blub -> https://domain.de/blub)
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name domain.de mail.domain.de admin.domain.de;
    return 301 https://$server_name$request_uri;
}

但这不起作用,因为 default_server 被定义了两次。如何将这两个函数结合起来?

我真的必须向每个子域配置中添加第二个配置吗?

答案1

您需要default_server从后面的配置中删除并将每个域名添加到该server_name部分。

然后您需要使用return 301 https://$host$request_uri;重定向语句。

答案2

Nginx 不支持嵌套的 if 语句(也不支持复杂条件)。

答案3

我通过另一种方式让它工作。我通过 SSL 代码段将其添加到每个子域配置中。每个子域配置都包含相同的 SSL 配置。所以我在这个配置中添加了一个 http 检查:

if ($scheme = http ){
    rewrite ^ https://$server_name$request_uri permanent;
}
# ... followed by ssl config

这包含在每个子域服务器块配置中:

include snippets/ssl.conf;

它满足了我的要求。也许还有其他方法,无需将其包含到每个子域中。

相关内容