我已经有一个有效的配置,可以将所有不存在的子域重定向到特定域。现在我想添加一个配置,将所有 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;
它满足了我的要求。也许还有其他方法,无需将其包含到每个子域中。