NGINX регулярное выражение: перенаправление sub2.sub1.example.com чтобы sub1.example.com

#regex #nginx #ssl #redirect #lets-encrypt

#регулярное выражение #nginx #ssl #перенаправление #позволяет зашифровать

Вопрос:

Как я могу использовать regex и nginx вместе, чтобы все они перенаправлялись на одну и ту же конечную точку?

  1. http:// sub1.example.com
  2. http:// sub2.sub1.example.com
  3. http:// sub3.sub2.sub1.example.com
  4. https:// sub1.example.com
  5. https:// sub2.sub1.example.com
  6. 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 также оптимизирован для этого порядка, с самым медленным регулярным выражением):

  1. точное совпадение
  2. ведущий *
  3. завершающий *
  4. первое совпадение регулярных выражений

Вот логика сопоставления и перенаправления, реализованная в приведенном ниже коде:

многоуровневые поддомены —> к одноуровневому поддомену -> к ssl

По-прежнему не удается разрешить 5 и 6 без предупреждения безопасности браузера (firefox и safari не выдают эти ошибки), из-за того, что мой подстановочный сертификат ssl действителен только для *.example.com . Обойти это просто невозможно.

  1. http:// sub1.example.com
  2. http:// sub2.sub1.example.com
  3. http:// sub3.sub2.sub1.example.com
  4. https:// sub1.example.com
  5. https:// sub2.sub1.example.com
  6. 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