
Estou tentando descobrir como lidaria com a inclusão de determinados nomes de domínio na lista de permissões. Se a solicitação for originada de um subdomínio específico, como <id>.domain-name.com
, o acesso às imagens será restrito a uma lista de permissões de domínios aprovados. Solicitações de domínios que não estão na lista de permissões resultarão em um erro 403.
Não tenho certeza do que devo fazer exatamente? Eu uso map
contexto?
por exemplo, meu nginx.conf seria parecido com isto
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;
}
Responder1
Sua nginx
configuração parece correta, mas há algumas alterações que você pode fazer para garantir que funcione conforme o esperado.
Primeiro, você precisa definir a lista de permissões real de domínios que têm permissão para acessar as imagens. Na sua configuração atual, você definiu dois domínios na lista de permissões como whitelist1
e whitelist2
. Você deve substituí-los pelos nomes de domínio reais que têm permissão para acessar as imagens.
Segundo, no contexto do seu mapa, você definiu a variável $whitelist
como o valor do subdomínio que está fazendo a solicitação. Porém, o que você realmente precisa é do valor do nome de domínio que está fazendo a solicitação, sem o subdomínio. Você pode modificar o contexto do seu mapa para extrair o nome de domínio da seguinte maneira:
map $http_host $whitelist {
default 0;
"~^(?<subdomain>\w+)\.(?<domain>domain-name\.example\.com)$" $domain;
# whitelist domains
whitelist1 example.com;
whitelist2 subdomain.example.com;
}
No exemplo acima, a expressão regular captura o subdomínio e o nome de domínio separadamente. A variável $domain
é então definida com o valor do nome de domínio sem o subdomínio.
Finalmente, você pode usar a $whitelist
variável em seu bloco de servidor para determinar se deseja permitir ou negar acesso às imagens. Sua configuração atualizada ficaria assim:
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;
}
}