我將如何處理域白名單?

我將如何處理域白名單?

我正在嘗試找出如何處理將某些網域列入白名單的問題。如果請求源自特定子網域,例如<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配置看起來基本上正確,但您可以進行一些更改以確保其按預期工作。

首先,您需要定義允許存取影像的實際網域白名單。在目前設定中,您已將兩個列入白名單的網域定義為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;
  }
}

相關內容