我已经向我的网站添加了 SSL 证书,并且我有一个如下所示的配置文件:
server {
listen 80;
listen [::]:80;
server_name www.default.com default.com;
return 301 https://default.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name default.com;
...
}
我有几个客户在服务器的 IP 地址上查看临时站点,因此,例如,我会要求他们查看http://123.123.123.123
现在,该 IP 地址已与几百人共享,并且 SSL 附加功能已破坏了 IP 地址链接,因此我想将其重定向到域名。
我是否将重定向添加到顶部块,或者创建第三个块?
例如:
server {
listen 80;
listen [::]:80;
server_name www.default.com default.com;
return 301 https://default.com$request_uri;
}
server {
listen 80;
listen 123.123.123.123:80;
server_name 123.123.123.123;
return 301 https://default.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name default.com;
...
}
上面的代码看起来对吗?这是我做过的第一个 nginx 配置——我在 Google 上搜索了重定向的布局,但不确定它是否应该放在自己的块中。
答案1
最简单的方法是将默认服务器设为重定向器。因此,第二个块可以直接运行,第一个块将变为:
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 default_server ssl;
listen [::]:443 default_server ssl;
server_name localhost;
root /var/empty;
return 301 https://default.com$request_uri;
}
将此服务器块视为回退,它也会使用服务器名称“localhost”。因此您以后不能使用该名称。您的第三个块(现在是第二个块)具有与第一个块相同的端口 443 匹配属性,但指定了不同的主机名。当客户端发送正确的主机名时,此服务器块是更精确的匹配,因此会覆盖回退。
当客户端连接端口 80 时,由于没有更具体的匹配,因此适用回退。
当它连接到端口 443,但发送不同的主机名时,nginx 会看到,default_server
因此会忽略server_name
匹配。所有包含主机名的响应都将使用,并且可能包含在日志中的server_name
变量将使用此名称。$host
请注意,我更喜欢使用default_server
而不是依赖服务器块的排序。
最后 - 重定向到端口 443 将仅有的如果您的证书涵盖客户端发送的主机名,则此证书将起作用。否则 SSL/TLS 握手将在 HTTP 部分发挥作用之前失败。由于我们有letsencrypt这应该不是问题。您可以简单地将他们的证书用于任何有效或广告宣传的主机名,并将经过验证的证书用于您的官方网站。
答案2
注意:“VirtualHost” 是 Apache 术语。NGINX 没有虚拟主机,它有使用 server_name 和 listen 指令绑定到 tcp 套接字的“服务器块”。
https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks
服务器块被视为独立的。因此,如果您需要重定向,则需要在每个服务器块中指定应将访问者重定向到其他地方的内容。
例如,这是一个改进的配置
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
# Add SSL stuff here.
server_name www.default.com default.com;
}
server {
listen 80;
# Add SSL stuff, if you want to redirect from HTTPS via IP to Domain, too.
server_name 123.123.123.123;
return 301 https://default.com$request_uri;
}