NGINX 重定向不存在的域名

NGINX 重定向不存在的域名

假设我有以下域名:

example.com

使用这些子域名:

test.example.com

prod.example.com

所有这些都只能通过 HTTPS 访问。当有人进入https://test2.example.com或任何其他不存在的子域时,他们会获得标准的 NGINXindex.html文件。相反,我希望他们被重定向回https://example.com

我的服务器块如下所示/etc/nginx/nginx.conf

    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  example;
        root         /usr/share/nginx/html;
        index index.html
        ssl on;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;


        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

        return  301 https://example.com$request_uri;
    }

我希望该行return 301 https://example.com$request_uri;能够解决这个问题,但它不起作用。Chrome 显示以下错误:

ERR_TOO_MANY_REDIRECTS

什么在起作用,地址栏中的 URI 是否从 更改为test2.example.comexample.com我只是遇到了太多重定向的问题。或者也许有更好的方法来做到这一点?

答案1

您当前有一个服务器块,它也是默认服务器块。

你应该把它分成两个块。一个块处理命名域,另一个处理所有不存在的域:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

server {
    listen  443 ssl default_server;
    listen  [::]:443 ssl default_server;
    return  301 https://example.com$request_uri;
}

server {
    listen  443 ssl http2;
    listen  [::]:443 ssl http2;

    server_name  example.com test.example.com prod.example.com;

    root    /usr/share/nginx/html;
    index   index.html

    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

许多ssl_xxx指令可以放在server块上方(周围http块内),以便它们可以被两者继承 - 或者您可以将它们复制到每个服务器块中(您的选择)。

这个文件了解更多信息。

答案2

在 Nginx 中你的 server_name 可以是 *.example.com(但不是。例子。),因此,如果您愿意,可以将所有主机名 test.example.com、test2.example.com、prod.example.com 都交给一个网站提供服务。如果您申请了通配符 DNS SSL 证书,那么您可以在 example.com 下的所有网站上使用 https。

您可以通过在 nginx 中创建一个或多个服务器块来隔离站点,并且只使用一个证书。

相关内容