Nginx IP 重定向配置布局

Nginx IP 重定向配置布局

我已经向我的网站添加了 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;
}

相关内容