
Я пытаюсь выяснить, как мне справиться с внесением в белый список определенных доменных имен. Если запрос исходит из определенного поддомена, например <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;
}
}