我对 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 以避免多次重定向。