como restringir o acesso ao diretório e subdiretórios

42

Eu preciso restringir o acesso a quaisquer arquivos ou subdiretórios no diretório "testdir". Meu conf:

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

Na minha configuração, não tenho restrições em / testdir / jpg_or_txt-files. Como fazer isso?


fonte
Observe que, na minha experiência, a função location somente funciona corretamente ao executar o nginx no linux. Quando executado no Windows, tivemos problemas com isso não funcionar ...
samsmith

Respostas:

43

restringir o acesso a vários diretórios no nginx em uma entrada de local

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...
DavidR.
fonte
7
Você deve retornar 403 e não 404.
Stillmatic1985
12
Isso não responde à pergunta.
1
retornar 403 dá uma dica de que a pasta existe, um 404 não dá nenhuma evidência da pasta existente
Don Wilson
23

É porque a diretiva "raiz" corresponde antes que a diretiva "negar" possa ser correspondida. Inverta a ordem das suas diretivas e deve funcionar:

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...
Guillaume Filion
fonte
16

Para garantir que a correspondência testdir seja escolhida em vez da correspondência jpg / txt, use os seguintes locais:

location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}

No seu exemplo, você tem dois tipos de locais. location /testdiré um local de prefixo, pois não possui til ( ~) entre locatione /testdir.

location ~* ^.+\.(jpg|txt)$é um local de regex (que não diferencia maiúsculas de minúsculas, devido ao *diretamente após o til). Na documentação do nginx :

Para encontrar um local que corresponda a uma determinada solicitação, o nginx primeiro verifica os locais definidos usando as sequências de prefixos (localizações do prefixo). Entre eles, o local com o prefixo correspondente mais longo é selecionado e lembrado. Em seguida, as expressões regulares são verificadas, na ordem em que aparecem no arquivo de configuração. A pesquisa de expressões regulares termina na primeira correspondência e a configuração correspondente é usada. Se nenhuma correspondência com uma expressão regular for encontrada, a configuração do local do prefixo lembrado anteriormente será usada.

O problema aqui é que seu local testdir está sendo lembrado, mas o local jpg / txt é selecionado durante o estágio regex, conforme corresponder. A seguinte nota da documentação é sobre a qual baseei minha solução (fornecida acima):

Se o local do prefixo correspondente mais longo tiver o modificador “^ ~”, as expressões regulares não serão verificadas.

Restabelecer Monica 2331977
fonte
11
location /foo {
    deny all;
    return 404;
}

Isso lhe dará 403 o tempo todo por causa da negação de tudo ... Quando você deseja que o servidor lhe dê 404, basta retornar apenas 404 ... da seguinte forma:

location /foo {
    return 404;
}
RemyNL
fonte