假设我有以下域名:
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.com
。example.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 中创建一个或多个服务器块来隔离站点,并且只使用一个证书。