次の結果を達成したいと思います。
これは私が使用しているnginx構成です:
server {
listen 80 default;
# Basic auth
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
satisfy any;
# IP whitelist
include /etc/nginx/conf.d/ip-whitelist.conf.include;
deny all;
# Lock down the "hello" directory to specific IP addresses
location /hello/ {
# Developers only - ever!
allow 12.34.56.78;
deny all;
}
# ...
}
現時点で起こっていることは、上記の箇条書きリストのポイント1と2が機能していることです。つまり、ホワイトリスト内のIPにはサイト全体で基本認証がありませんが、IPがホワイトリストに登録されていない場合は、基本認証を求められます。
ただし、「hello」のロケーションブロックは機能していないようで、「hello」ディレクトリの下にあるものすべてに対して、上記と同じ条件を許可しています。ホワイトリストに登録されたIPから/hello/world.php
にアクセスしようとすると、そのIPが提供されます。ホワイトリストに登録されていないIPからアクセスすると、基本認証が取得されます。
IP 12.34.56.78
以外のすべてのユーザーが "hello"ディレクトリにアクセスできないようにしたい(例)。
何を変更する必要がありますか?
ご存じのとおり、サーバーレベルでの認証設定はすべての場所に適用されるため、お勧めしません。基本認証をオフにすることは可能ですが、既存のIPホワイトリストをクリアする方法はないようです。
より良い解決策は、認証を/
の場所に追加して、/hello
に継承されないようにすることです。
他の場所で基本的な認証とIPホワイトリストが必要な場合に問題が発生します。その場合、認証コンポーネントをインクルードファイルに移動するか、/
にネストすることを検討する価値があります。
server {
listen 80 default;
# Lock down the "root" directory to specific IP addresses
location / {
satisfy any;
# Basic auth
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
# IP whitelist
include /etc/nginx/conf.d/ip-whitelist.conf.include;
deny all;
# Inherits auth settings from parent
location ~ \.php$ {
# PHP specific config
}
}
# Lock down the "hello" directory to specific IP addresses
location /hello/ {
# Developers only - ever!
allow 12.34.56.78;
deny all;
}
# ...
}