Excluindo um diretório de uma regra de reconfiguração root .htaccess para permitir que ele seja protegido por senha?

2

Eu passei uma quantidade enorme de tempo na semana passada tentando descobrir isso, mas não importa o que eu tente, não consigo fazer isso funcionar. Meu host disse que eles não tinham ninguém que soubesse o suficiente sobre arquivos .htaccess para obter esse trabalho (encorajador, certo?), E a empresa que eu comprei meu CMS também não poderia determinar uma solução. Eu também li dezenas de dúzias de respostas aqui e em outros sites, mas simplesmente não consigo consertar meu problema.

O negócio é o seguinte: Meu CMS - Invision Power Board - gera o seguinte arquivo .htaccess que fica na raiz do site:

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} .*\.(jpeg|jpg|gif|png)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /public/404.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Eu tenho um subdiretório, sub_dir , que eu preciso proteger por senha usando um arquivo .htaccess no subdiretório. Eu configurei a proteção por senha através do cPanel e se o arquivo .htaccess na raiz do site estiver desativado, ele funcionará bem. No entanto, se o arquivo .htaccess na raiz do site não estiver desabilitado, quando eu navegar para sub_dir , a página inicial será exibida. No começo eu pensei que a página inicial sendo exibida poderia ter algo a ver com a reconfiguração da página 404, mas a página inicial ainda é exibida mesmo se eu remover as condições de reescrita e a regra para a página 404.

O código no arquivo .htaccess em sub_dir é:

AuthUserFile "/home/[user]/public_html/.htpasswd"
AuthType Basic
AuthName "subdir"
require valid-user

Como mencionado anteriormente, a proteção por senha funciona quando o arquivo .htaccess no diretório raiz está desativado. Ele também funciona quando eu removo as condições de reescrita inferiores e as regras (as linhas de index.php), mas remover as condições de reescrita e regras para a página 404 não afeta nada.

Eu tentei dezenas de soluções potenciais, nenhuma delas funcionou. Para citar alguns, eu tentei a resposta de Poncha abaixo:

RewriteCond %{REQUEST_URI} !^sub_dir

Eu também tentei isso:

RewriteRule ^/sub_dir  - [L]

Assim como muitas outras coisas que eu nem me lembro agora. O ponto é que nada funcionou até agora. Eu também tentei todas as combinações possíveis com relação às barras principais e seguintes.

Meu servidor está executando o Apache 2.2.22.

Estou seriamente atento às minhas dúvidas aqui. Por favor ajude.

    
por Nate 16.07.2012 / 00:14

8 respostas

2

Parece que você já tentou isso, é a resposta mais óbvia (como poncha apontou) e é provavelmente o mais provável de aparecer em um tutorial / guia mod_rewrite. Expirando o diretório usando um RewriteCond , observando que a correspondência da condição é contra o %{REQUEST_URI} , que começa com um / ":

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/sub_dir
RewriteCond %{REQUEST_FILENAME} .*\.(jpeg|jpg|gif|png)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /public/404.php [L]

RewriteCond %{REQUEST_URI} !^/sub_dir
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

EDITAR:

Olhando para o que você tentou, isso também está errado. Você não quer a barra inicial na correspondência do RewriteRule quando estiver em um arquivo htaccess:

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On

RewriteRule ^sub_dir  - [L]


RewriteBase /
RewriteCond %{REQUEST_FILENAME} .*\.(jpeg|jpg|gif|png)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /public/404.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
    
por 18.07.2012 / 00:32
1

Esta regra encaminha para a página inicial se o caminho solicitado não for um arquivo existente e não for um diretório existente.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Evidentemente, como você está sendo encaminhado para a página inicial, o servidor acredita que o diretório sub_dir não existe ou a solicitação para sub_dir está sendo redirecionada para algo que não existe.

A primeira coisa a verificar neste cenário é, claro, se sub_dir é um diretório real, tendo em mente que, dependendo do nome do diretório, o diferencia maiúsculas de minúsculas na maioria dos casos O Apache está sendo executado, e também tendo em mente que um link simbólico não é necessariamente tratado da mesma forma que um diretório.

    
por 18.07.2012 / 07:26
1

Que tal você tentar apenas fazer isso no seu sub_dir .htaccess para não permitir que o modrewrite se propague para o seu sub_dir :

    ## turn off rewrite engine
    RewriteEngine Off
    ## now do your auth stuff
    AuthUserFile "/home/[user]/public_html/.htpasswd"
    AuthType Basic
    AuthName "subdir"
    require valid-user

e se você realmente precisa reescrever as regras para trabalhar dentro do sub_dir, faça-as especificamente nesse arquivo .htaccess para que nunca haja qualquer confusão. Assim que você executar RewriteEngine On / Off, as regras da pasta pai não serão aplicadas diretamente. Eles são lidos dessa pasta primeiro e depois da raiz.

    
por 19.07.2012 / 03:17
1

Primeiro aviso:

AuthUserFile "/home/[user]/public_html/.htpasswd"

Parece que seu arquivo .htpasswd está em um local publicamente acessível (public_html). Este é um problema de segurança, você deve transferir esse arquivo para algum lugar onde o usuário do apache possa lê-lo (verifique o diretório de direitos de arquivos anf), mas certamente não em um lugar sob um DocumentRoot. Ninguém deve ser requisitado diretamente para um arquivo .htpasswd, é um arquivo somente do lado do servidor. Mas não está relacionado ao seu problema .

Seu principal problema é que você não respondeu @Jon Lin & Perguntas do @mootinator. Quais arquivos você está tentando solicitar em sub_dir, existem alguns arquivos html, outro arquivo index.php? Você deve permitir a listagem de diretórios neste diretório? Como você faz seus testes?

Quando uma solicitação em sub_dir é feita, o pai .htaccess é aplicado por padrão (tentando redirecionar todas as solicitações imagináveis para um boostrapper index.php, exceto para arquivos de imagens ausentes e exceto para diretórios ou arquivos existentes). Portanto, solicitando um arquivo real em sub_dir você não deve ter nenhum problema com essas regras . Uma boa maneira de testar isso é comentar as regras no seu .htaccess raiz.

Você disse que fez alguns testes sem o arquivo root .htaccess e funcionou. Então, talvez seja a remoção de Options -MultiViews que fez seus testes ok. MultiViews é parte da negociação de conteúdo e é uma palavra muito mágica com alguns comportamentos muito estranhos , então vamos dizer, por exemplo, que você está solicitando subd_dir/foo em seus testes. Os MultiViews podem encontrar um arquivo sub_dir/FoO.html e atendê-lo. Remova MultiViews e seus testes não funcionarão mais (talvez). Propostas do @Mootinator sobre problemas de links simbólicos também podem ser válidas, e você também pode ter algo nos arquivos testados redirecionando para um URL capturado pela primeira regra, não há fim para coisas estranhas. Mas com certeza "não funciona" não é suficiente, o que é "isso"?

Como eu disse, você precisa nos dar mais informações. E dê a todos os outros leitores (mesmo no futuro) elementos suficientes para ver se o seu problema pode estar relacionado a seus problemas. O objetivo não é contratar alguns especialistas para trabalhar diretamente em seu servidor, mas para obter respostas válidas para problemas válidos e detalhados.

    
por 20.07.2012 / 14:31
1

As soluções acima não funcionam porque não abordam o problema fundamental, ou seja, a subpasta a ser excluída das regras é protegida por senha.

Quando o acesso inicial é rejeitado pelo Apache e a caixa de diálogo de login é apresentada, as regras de reconfiguração entram em ação, mas não podem redirecionar o cliente para um arquivo acessível, portanto, ocorre o erro 404. Para resolver este problema, precisamos fornecer um arquivo "fictício" para o qual o cliente pode ser direcionado quando a tentativa de acesso inicial falhar.

ErrorDocument 401 /failed_auth.html
RewriteCond %{REQUEST_URI} ^/pwd-protected-sub-folder/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/failed_auth.html$
RewriteRule ^.*$ - [L]
    
por 03.01.2013 / 01:39
0

Adicione outro RewriteCond para excluir o sub_dir desejado (para as duas regras):

RewriteCond %{REQUEST_URI} !^sub_dir
    
por 16.07.2012 / 06:55
0

Adicionando isso na esperança de que ajude alguém. @Mike L estava no caminho certo com isso, eu acho. Eu tive uma situação semelhante (htaccess senha protegida sub-diretório com regras de reescrita no htaccess raiz que eu ainda precisava para o site principal). A solução para mim no final foi simplesmente adicionar isso ao arquivo .htaccess raiz.

ErrorDocument 401 "Unauthorised"

Você ainda precisará adicionar as regras relevantes para permitir o acesso ao subdiretório, mas a solicitação de senha não exibida foi corrigida usando o acima. Espero que ajude!

    
por 20.02.2013 / 20:21
0

Para um site que usa hospedagem compartilhada baseada em cPanel (Apache 2.2), resolvi o que parece ser o mesmo problema adicionando um arquivo chamado "401.shtml" à raiz do documento (public_html). A mera existência do arquivo, mesmo sem uma diretiva ErrorDocument 401 no .htaccess, resolveu o problema.

    
por 02.03.2015 / 17:56