nginx のプライベート ネットワーク以外から https にリダイレクトする

nginx のプライベート ネットワーク以外から https にリダイレクトする

ネットワーク外部からのすべてのリクエストを https にリダイレクトし、内部のリクエストは http のままにしておきたいです。

現在、2 つの.confファイルがあります。1 つは次のように始まります。

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

次のようにして、ローカル ネットワーク上の 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_モジュールクライアントに基づいてローカル ネットワークを分離します。

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 を使用することを推奨します。これは、ローカル ネットワークにアクセスするだけで、簡単に中間者攻撃のポジションを獲得できるためです。

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

関連情報