nginx의 개인 네트워크가 아닌 경우 https로 리디렉션

nginx의 개인 네트워크가 아닌 경우 https로 리디렉션

네트워크 외부에서 들어오는 모든 요청을 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.comhttps로 리디렉션되지 않습니다.

왜 그런 겁니까? 내가 뭘 잘못했나? 내 목표는 홈 개인 네트워크( 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/24server블록은 외부 연결에도 사용됩니다. 이 토폴로지는 다음과 유사합니다.

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{
       .......
    }
}

관련 정보