
特定のドメイン名をホワイトリストに登録する方法を調べています。 などの特定のサブドメインからリクエストが発信された場合、<id>.domain-name.com
画像へのアクセスは承認済みドメインのホワイトリストに制限されます。ホワイトリストにないドメインからのリクエストは 403 エラーになります。
具体的に何をすればいいのかわかりません。map
コンテキストを使用すればいいのでしょうか?
例えば、私のnginx.confは次のようになります
map $http_host $whitelist {
default 0;
"~^(?<id>\w+)\.domain-name\.example\.com$" $id;
# whitelist domains
whitelist1 1;
whitelist2 1;
}
server {
listen 80;
proxy_intercept_errors on;
error_page 400 = @fallback;
if ($whitelist = 0) {
return 403;
}
proxy_pass $whitelist;
}
答え1
構成nginx
はほぼ正しいように見えますが、期待どおりに動作するようにするために、いくつか変更できる点があります。
まず、イメージへのアクセスが許可されるドメインの実際のホワイトリストを定義する必要があります。現在の構成では、 と の 2 つのホワイトリスト ドメインが定義されていますwhitelist1
。whitelist2
これらを、イメージへのアクセスが許可される実際のドメイン名に置き換える必要があります。
次に、マップ コンテキストで、リクエストを行っているサブドメインの値として変数を定義しました$whitelist
。ただし、実際に必要なのは、サブドメインを除いた、リクエストを行っているドメイン名の値です。次のようにマップ コンテキストを変更して、ドメイン名を抽出できます。
map $http_host $whitelist {
default 0;
"~^(?<subdomain>\w+)\.(?<domain>domain-name\.example\.com)$" $domain;
# whitelist domains
whitelist1 example.com;
whitelist2 subdomain.example.com;
}
上記の例では、正規表現によってサブドメインとドメイン名が別々に取得されます。$domain
その後、変数はサブドメインなしのドメイン名の値に設定されます。
最後に、サーバー ブロック内の変数を使用して、$whitelist
画像へのアクセスを許可するか拒否するかを決定します。更新された構成は次のようになります。
map $http_host $whitelist {
default 0;
"~^(?<subdomain>\w+)\.(?<domain>domain-name\.example\.com)$" $domain;
# whitelist domains
whitelist1 example.com;
whitelist2 subdomain.example.com;
}
server {
listen 80;
proxy_intercept_errors on;
error_page 400 = @fallback;
if ($whitelist = 0) {
return 403;
}
location /images {
# allow access only to whitelisted domains
allow $whitelist;
deny all;
# serve images from disk
alias /path/to/images;
}
location @fallback {
# handle errors
return 400;
}
}