NGINX 重定向多个域名

NGINX 重定向多个域名

我对 NGINX 和整个配置都很陌生,因此在朋友的帮助下我设法设置了一个具有以下配置的服务器:

    server {
        listen 80;
        listen [::]:80;
        server_name domain.com;
        rewrite         ^       https://$server_name$request_uri? permanent;
}

server {
        listen 80;
        listen [::]:80;
        server_name domain.de;
        rewrite         ^       https://$server_name$request_uri? permanent;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name domain.com domain.de;
        root /var/www/html;
        index index.php index.html index.htm;

我的主页、一些项目页面和一些私人页面有多个服务器。我为每个 TLD 都配备了一个自己的服务器,因为我不想在重定向时更改地址栏中的 TLD。现在我的答案是,如何才能简单地将所有这些非 SSL 服务器转移到一个大服务器(1/项目),而不是重定向到一个 TLD?

例子:

Project.com、Project.de、Project.net 和 Project.org 正在将超过 5 个非 SSL 服务器重定向到一个启用 SSL 的服务器。当我要http://project.net我被重定向到https://project.net。由于单一非 SSL 服务器设置,TLD 根本没有改变。

我想要实现的是,我可以最小化我的配置文件,以便每个项目都有一个非 SSL 服务器重定向到 https,而无需更改域。

                                       :80 Server      :443 Server

http domain.net ---> https domain.net ([非 SSL 01] ---> [SSL 01]) http domain.com ---> https domain.com ([非 SSL 02] ---> [SSL 01]) http domain.de ---> https domain.de ([非 SSL 03] ---> [SSL 01])

http project.de ---> https project.de ([non-SSL 04] ---> [SSL 02]) http project.com ---> https project.com ([non-SSL 05] ---> [SSL 02]) 等等

答案1

我的理解是您想将多个域重定向到一个域。

首先,我建议你使用return 301而不是rewrite。在这种情况下,它更有效率。

这是默认的服务器配置。如果请求与任何虚拟主机都不匹配,则将提供此配置。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://your-correct-domain.com$request_uri;
}

还设置一个服务器来接收 your-correct-domain.com 的 HTTP 流量并将其重定向到 HTTPS。

server {
    listen 80;
    listen [::]:80;
    server_name your-correct-domain.com;
    return 301 https://your-correct-domain.com$request_uri;
}

最后,您的所有配置都位于 your-correct-domain.com 的 HTTPS 服务器上。

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name your-correct-domain.com;
    root /var/www/html;
    index index.php index.html index.htm;
}

请注意,如果有人直接访问 IP,此设置将提供默认服务器。例如,您的服务器 IP 是192.168.100.100,如果有人在浏览器中输入该 IP,他们将被重定向到https://your-correct-domain.com

默认服务器将捕获所有没有为其准备服务器/虚拟主机的请求。因此,如果有人请求domain.de, my.domain.de, site2.domain-something.com,他们都将永久重定向https://your-correct-domain.com。您还可以选择使用302而不是 301。

最后需要注意的是,如果您有其他虚拟主机,但不包含在您正在进行的设置中,则不会有问题。默认服务器将不会为此提供服务,因为 Nginx 将首先检查虚拟主机是否存在,并首先为其提供服务。

答案2

与澄清的问题相对应的更新答案。

这种重定向可以按如下方式进行:

server {
    server_name _;
    listen 80 default_server;

    return 301 https://$server_name$request_uri;
}

这是一个默认的服务器块,可匹配任何域名。我们只需返回一个 301 重写响应,其中包含请求中使用的服务器名称。这将执行您的示例所显示的操作。

答案3

这是正确答案!

server {
    server_name _;
    listen 80 default_server;
    return 301 https://$host$request_uri;
}

不要使用 $server_name,而要使用 $host。您也可以选择使用 302 重定向,因为 301 是永久性的,如果您更改了某些内容,由于跨设备缓存,可能更难修复。如果您还没有大量可能在将来更改 URL 的 http 链接,则仅使用 301 以避免多次重定向。

相关内容