#regex #nginx #ssl #redirect #lets-encrypt
#регулярное выражение #nginx #ssl #перенаправление #позволяет зашифровать
Вопрос:
Как я могу использовать regex и nginx вместе, чтобы все они перенаправлялись на одну и ту же конечную точку?
- http:// sub1.example.com
- http:// sub2.sub1.example.com
- http:// sub3.sub2.sub1.example.com
- https:// sub1.example.com
- https:// sub2.sub1.example.com
- https:// sub3.sub2.sub1.example.com
—- все разрешаются в —> https:// sub1.example.com
Моя текущая конфигурация (работает только для случаев 2 и 3):
# Default server configuration
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ~^(.*).(?<subdomain>w ).example.com$;
return 301 https://$subdomain.example.com$request_uri;
}
server {
# SSL configuration
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
#
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
#
root /var/www/html;
server_name *.example.com;
location / { ..... localhost:3000
затем в другом файле:
server {
# Redirect all http traffic to https
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
# SSL configuration
listen 443 ssl;
listen [::]:443 ssl;
#
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
#
root /var/www/html;
server_name example.com www.example.com ;
if ($http_x_forwarded_proto = "http") {
return 301 https://$server_name$request_uri;
}
location / { .... localhost:8000
Комментарии:
1. Регулярное выражение, которое я в настоящее время использую для server_name, работает не так, как ожидалось. Кроме того, у меня возникают проблемы со временем, потому что браузер кэширует перенаправление, и я вынужден каждый раз закрывать и перезапускать браузер. Есть ли лучший способ? Я думал, что эту проблему можно было бы быстро решить, но я потратил часы на поиски решения.
Ответ №1:
Я могу разрешить случаи 1-4, используя логику сопоставления сервера NGINX с регулярным выражением.
Nginx будет разрешать имена серверов в этом порядке (примечание: Nginx также оптимизирован для этого порядка, с самым медленным регулярным выражением):
- точное совпадение
- ведущий *
- завершающий *
- первое совпадение регулярных выражений
Вот логика сопоставления и перенаправления, реализованная в приведенном ниже коде:
многоуровневые поддомены —> к одноуровневому поддомену -> к ssl
По-прежнему не удается разрешить 5 и 6 без предупреждения безопасности браузера (firefox и safari не выдают эти ошибки), из-за того, что мой подстановочный сертификат ssl действителен только для *.example.com . Обойти это просто невозможно.
http:// sub1.example.comhttp:// sub2.sub1.example.comhttp:// sub3.sub2.sub1.example.comhttps:// sub1.example.com- https:// sub2.sub1.example.com
- https:// sub3.sub2.sub1.example.com
——-> https:// sub1.example.com
# Default server configuration
server {
listen 80;
listen [::]:80;
listen 443;
listen [::]:443;
server_name ~^(.*).(?<subdomain>w ).example.com$;
return 301 http://$subdomain.example.com$request_uri;
}
server {
listen 80;
listen [::]:80;
server_name ~^(?<subdomain>w ).example.com$;
return 301 https://$subdomain.example.com$request_uri;
}
server {
# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
#
root /var/www/html;
location / { ..... localhost:3000