我想知道如何处理将某些域名列入白名单的问题。如果请求来自特定子域(例如),则<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
配置看起来大部分都是正确的,但您可以进行一些更改以确保它按预期工作。
首先,您需要定义允许访问图像的实际域白名单。在当前配置中,您已将两个白名单域定义为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;
}
}