NGINXredirect不存在的域

可以说我有以下的域名:

example.com

与这些子域名:

test.example.com

prod.example.com

全部只能通过HTTPS访问。 当有人inputhttps://test2.example.com或任何其他不存在的子域名时,他们将得到标准的NGINX index.html文件。 相反,我希望他们被redirect回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 

什么是工作,是地址栏从test2.example.com更改为example.com的URI。 我只是有太多的redirect的问题。 或者也许有更好的方法来做到这一点?

您目前有一个服务器块,这也是默认的服务器块。

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

 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块中),以便它们被两者inheritance – 或者你可以将它们复制到每个服务器块(你的select)中。

请参阅此文档了解更多

在Nginx中,您的server_name可能是* .example.com(但不是.example ),所以如果需要,所有主机名test.example.com,test2.example.com,prod.example.com都可以由一个网站提供服务。 如果您申请通配DNS SSL证书,则可以在example.com下的所有网站上使用https。

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