У меня есть веб-сайт, на котором я хочу обслуживать запросы только на:
abc.mywebsite.com
Я хочу, чтобы любые запросы на:
www.mywebsite.com
mywebsite.com
<anything that is not abc>.mywebsite.com
направлялись на abc.mywebsite.com
, потому что у меня есть сертификат специально для этого. Как я могу написать свой файл conf для этого?
Вот мой файл 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;
Вам нужен Блок 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
.
Я добавил это к каждому блоку сервера:
if ($host !~* ^abc\.mywebsite\.com$ ) {
return 301 https://abc.mywebsite.com$request_uri;
}
И он работает именно так, как я хочу. Я знаю, что некоторым людям не нравятся утверждения if
. Тогда почему они там? Прекрасно работает.