Autenticação Apache: permite acesso público a um subdiretório

13

Provavelmente, este é um problema simples, mas não consigo encontrar a solução na documentação.

Quero proteger meu site com senha usando autenticação BASIC. Mas eu quero que um subdiretório não seja protegido:

http://mysite.com/ -> BASIC protected
http://mysite.com/somedir -> BASIC protected
http://mysite.com/someotherdir -> BASIC protected
http://mysite.com/public -> not protected

Não tenho nenhum problema em proteger todo o site, mas não sei como posso "desproteger" um diretório. O site está hospedado em um host compartilhado, portanto, só tenho acesso aos arquivos .htaccess para fazer a configuração.

Existe uma diretiva para negar a autenticação?

Obrigado pela ajuda ...

Guillaume
fonte
Esta parece ser a solução mais correta: stackoverflow.com/questions/2641646/...
BryanK

Respostas:

10

Não deve ser um problema com .htaccess, dependendo do que o host permitiu.

Você pode tentar colocar um .htaccess na subpasta com o seguinte, embora as substituições precisem ser ativadas para os diretórios em que está.

 Allow From All
 Satisfy Any
Cilíndrico
fonte
1
O segredo aqui, o IIRC, é colocar o .htaccess na raiz do seu site, mas ter uma entrada nesse arquivo .htaccess como o que o Cylindric fala.
21715 Paul Lathrop
E não esqueça de adicionar (ou garantir que exista) um AllowOverride para que o .htaccess seja usado.
27630 TCampbell
1
@Paul - Excluí minha resposta, mas a resposta da AFAICR Cylindric está errada no momento? Um arquivo .htaccess em um subdiretório não pode substituir um acima. No entanto, o arquivo .htaccess no diretório pai também pode incluir controles (ou mesmo removê-los) para subdiretórios.
Alnitak
Tentei colocar uma diretiva <Directory /> na pasta raiz e na pasta que quero que seja pública, mas nos dois casos recebo um HTTP 500. Alguma outra idéia?
Guillaume
1
Você não pode usar o <Directory> no .htaccess, embora possa usar <Files> e <Location>
Alnitak
7

OK, para um caminho server.com/private/public:

server.com/private/.htaccess

AuthType Basic
AuthName "Private, keep out."
Require...

server.com/private/public/.htaccess

Allow From All
Satisfy Any

A chave aqui é 'Satisfazer qualquer um' que ORs os requisitos do upstream juntos. 'Satisfazer tudo' é o padrão.

CK.
fonte
Thx para explicar 'Satisfazer Qualquer' 👍
Mario
1

Eu acredito que isso pode fazer isso:

# put the global auth stuff here
...

# put the override here
<Location /public>
Allow from All
Satisfy Any
</Location>
Alnitak
fonte
Nunca é uma boa ideia usar <Location> s para controle de acesso. Ele controla apenas o acesso através de um nome, e não o próprio recurso. Portanto, qualquer coisa que forneça acesso a ele por um nome diferente (Alias, por exemplo) não terá controle de acesso aplicado a ele.
CK.
1
@CK Na verdade, você deve usar o Location se o local em questão não for um diretório físico, mas apenas um diretório "virtual" disfarçado por algo como mod_rewrite.
Natalie Adams
0

Eu consegui resolver isso fazendo isso:

<Directory "/path/to/maindirectory">
[... auth stuff ... ]
</Directory>

<Directory "/path/to/mysubdirectory">
 Allow from All
 Satisfy Any
</Directory>

NÃO use Locais, porque eles são feitos para diferenciar maiúsculas de minúsculas e não agem no acesso real à pasta, mas apenas sobre o URL.

Então, por exemplo, se eu escrever

http:/mywebsite/STUFF

ou

http://mywebsite/stuff

ou

http://mywebsite/StUfF

é diferente para o controle de localização, mesmo que o diretório físico chamado seja o mesmo !!!

Em resumo, você verifica o acesso ao diretório "coisas" e posso escrevê-lo com outro caso.

Além disso, o uso do arquivo .htaccess em um único diretório com controle de localização em outras pessoas não funcionou para mim.

Espero que ajude.

xela92
fonte