ネットワーク外部からのすべてのリクエストを 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;
# ...
}
これが機能するには、トポロジは次のようになります。
ただし、サーバーがプライベート ネットワーク上のクライアントと同じ NAT の背後にある場合192.168.1.0/24
、このserver
ブロックは外部接続にも使用されます。このトポロジは次のようになります。
後者の場合、例えば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{
.......
}
}