我该如何处理域名白名单?

我该如何处理域名白名单?

我想知道如何处理将某些域名列入白名单的问题。如果请求来自特定子域(例如),则<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;
  }
}

相关内容