我有一个网站,我只想在以下位置处理请求:
abc.mywebsite.com
我希望任何请求能够:
www.mywebsite.com
mywebsite.com
<anything that is not abc>.mywebsite.com
指向abc.mywebsite.com
,因为我有专门用于此的证书。我该如何编写 conf 文件来实现这一点?
这是我的配置文件:
server {
listen 80 default_server;
listen [::]:80 adefault_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 default ssl;
server_name abs.mywebsite.com;
ssl on;
ssl_certificate /etc/nginx/bundle.crt;
ssl_certificate_key /etc/nginx/abc.mywebsite.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /home/mywebsite/public;
try_files $uri/index.html $uri @app;
答案1
您需要default_server
为 HTTP 和 HTTPS 设置一个块。该块将处理您的重定向。
它看起来会像这样:
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://abc.mywebsite.com$request_uri;
}
此块将任何请求重定向到任何虚拟主机和abc.mywebsite.com
原始请求 URI。您可能希望删除request_uri
,因为通常没有匹配的页面。
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
... ssl_certificates here ...
return 301 https://abc.example.com$request_uri;
}
此块将到达端口 443 的任何虚拟主机的所有请求重定向到abc.example.com
原始 URI。使用 TLS,您需要拥有要重定向的域的有效证书,并且需要正确设置它们才能完全正常工作。
server {
listen 443 ssl;
server_name abc.example.com;
ssl_certificate /etc/nginx/bundle.crt;
ssl_certificate_key /etc/nginx/abc.mywebsite.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /home/mywebsite/public;
try_files $uri/index.html $uri @app;
}
这是 的实际块abc.example.com
。
答案2
我将其添加到每个服务器块:
if ($host !~* ^abc\.mywebsite\.com$ ) {
return 301 https://abc.mywebsite.com$request_uri;
}
而且它完全按照我的要求工作。我知道有些人不喜欢if
声明。那么它们为什么在那里呢?工作完美。