
我正在嘗試找出如何處理將某些網域列入白名單的問題。如果請求源自特定子網域,例如<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;
}
}