ドメインのホワイトリストをどのように処理すればよいですか?

ドメインのホワイトリストをどのように処理すればよいですか?

特定のドメイン名をホワイトリストに登録する方法を調べています。 などの特定のサブドメインからリクエストが発信された場合、<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 つのホワイトリスト ドメインが定義されていますwhitelist1whitelist2これらを、イメージへのアクセスが許可される実際のドメイン名に置き換える必要があります。

次に、マップ コンテキストで、リクエストを行っているサブドメインの値として変数を定義しました$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;
  }
}

関連情報