Перенаправление на https, если только из частной сети на nginx

Перенаправление на https, если только из частной сети на nginx

Я хотел бы перенаправить все запросы, поступающие извне сети, на https, но оставить внутренние запросы на http.

Сейчас у меня есть два .confфайла — один из них начинается так:

server {
        # listen [::]:443 ssl ipv6only=on; # managed by Certbot                                                                                                                                              
        listen 443 ssl; # managed by Certbot                                                                                                                                                                 
        server_name www.example.com , example.com;         
        # omitted stuff
}

и содержит

server {
    listen 80;
    server_name www.example.com , example.com;         
    return 301 https://$host$request_uri;
}

и еще один, который начинается так:

server {                                                                                                                                                                                                     
        listen 192.168.1.144:80;                                                                                                                                                                             
        listen 192.168.1.196:80;                                                                                                                                                                             
                                                                                                                                                                                                             
        server_name "";                                                                                                                                                                                      
        root /var/www/html;                                                                                                                                                                                  
        # omitted stuff
   }

Но сейчас запросы наhttp://example.comне перенаправляются на https.

Почему так? В чем моя ошибка? Моя цель — перенаправить все запросы, не поступающие из домашней частной сети ( 192.168.1.*), на https, а внутренние оставить в покое.

решение1

server_nameдиректива использует пробелы для разделения доменных имен. В вашей конфигурации есть запятые, что сбивает с толку nginx.

Вам необходимо использовать:

server_name www.example.com example.com;

решение2

Я предполагаю, что с помощью следующего кода вы пытаетесь создать другой блок сервера, который прослушивает два интерфейса в локальной сети:

server {
    listen 192.168.1.144:80;
    listen 192.168.1.196:80;
    # ...
}

Чтобы это работало, ваша топология должна выглядеть примерно так:

Топология с Nginx, напрямую подключенным к Интернету

Однако, если ваш сервер находится за тем же NAT, что и клиенты в частной сети 192.168.1.0/24, этот serverблок будет использоваться и для внешних подключений. Эта топология будет похожа на эту:

Топология с NAT и переадресацией портов

В последнем случае вы можете использовать, например,ngx_http_geo_moduleдля разделения локальной сети по ее клиентам:

geo $external {
    default         1;
    192.168.1.0/24  0;
}

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html;
    
    if ($external) {
        return 301 https://$server_name$request_uri;
    }
}

Однако с точки зрения безопасности я бы не рекомендовал доверять вашей внутренней сети таким образом, а использовать TLS одинаково для каждого клиента. Это потому, что легко получить позицию MitM, просто имея доступ к локальной сети.

решение3

Попробуйте это для перенаправления, а для внутреннего использования я лично предпочитаю создавать имя сервера по IP-адресу.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /etc/ssl/example.crt;
    ssl_certificate_key /etc/ssl/example.key;

    server_name example.com www.example.com;

    location{
       .......
    }
}

Связанный контент