Problema redirecionando 403 Proibido 404 Not Found
-
23-08-2019 - |
Pergunta
A parte pertinente dos meus Looks .htaccess como esta:
Options -Indexes
<FilesMatch include>
Order allow,deny
Deny from all
</FilesMatch>
RedirectMatch 404 ^/include(/.*)$
E está gerando as seguintes respostas:
- / incluem 403
- / include / 404
- /include/config.inc 403
Eu posso dizer, olhando para o meu padrão que problema é provavelmente na parte (/.*), mas tudo o que eu tenho tentado me dá os mesmos resultados; em vez de ficar consistentemente 404 eu recebo um 404 para o caso e 403 para tudo o resto. O que está errado com a expressão que estou usando? Como alternativa, uma vez que tenho que fazer isso por alguns diretórios existe uma abordagem cobertor que me permita converter todas as 403 respostas a 404?
UPDATE: Descobri que, removendo o FileMatch I obter melhores resultados, então meu .htaccess agora se parece com isso:
Options -Indexes
RedirectMatch 404 ^/include(/.*)?$ # Added dlamblin's first suggestion
e gera as seguintes respostas:
- / incluem 404
- / include / 404
- /include/config.inc 403
UPDATE: Curiosamente descobri que o seguinte produz uma saída diferente:
RedirectMatch 404 ^/include(/?|/.*)$
RedirectMatch 404 ^/template(/?|/.*)$
A configuração padrão funciona em todos os casos, porém, incluir ainda está gerando 403 para todos os arquivos em incluir (por exemplo /include/config.inc) Este poderia ser um problema com o nome do diretório e não um problema com o .htaccess próprio arquivo?
UPDATE:. o seguinte no meu .htaccess foi em conflito com o redirecionamento ao acessar /include/config.inc
<FilesMatch config>
Order allow,deny
Deny from all
</FilesMatch>
Solução
Eu posso entender por que o / include não é pego pelo seu RedirectMatch, você não está fazendo o final '/' opcional, no entanto a parte /include/config.inc é um pouco no lado intrigante.
Aqui está o que eu tenho que trabalhar em Apache 2.2:
<FilesMatch /include(/?|/.*)>
Order allow,deny
Deny from all
</FilesMatch>
RedirectMatch 404 ^/include(/?|/.*)$
Este lida com esses casos:
/include 404
/include/ 404
/include/config.inc 404
Eu tive que mudar a parte FilesMatch para que o / incluir parte ao trabalho corretamente.
EDIT:
A linha de jogo também funciona sem a
Outras dicas
Outra possibilidade é não se preocupar combinando todo o caminho:
RedirectMatch 404 ^/include
Se houver caminhos de URL visíveis publicamente que pode começar com "/ include" (digamos, "/ includeMe"), um pequeno acréscimo irá separar o privado das URLs públicos:
RedirectMatch 404 ^/include(/|$)
Com Mod Rewrite:
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/\.
RewriteRule ^(.*)$ - [R=404]
Cada arquivo ou dir que começam com um ponto será redirecionado para 404.
/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2_dir3/
Ou para mudar todas as 403,400 erros em erros 404, colocar isso no final de /etc/apache2/conf.d/localized-error-pages ou em um .htaccess
# Will raise a 404 error, because the file <fake_file_for_apache_404.php> doesn't exist.
# We change 403 or 400 to 404 !
ErrorDocument 400 /fake_file_for_apache_404.php
ErrorDocument 403 /fake_file_for_apache_404.php
# We need to rewrite 404 error, else we will have "fake_file_for_apache_404.php not found"
ErrorDocument 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL <script type=\"text/javascript\">document.write(document.location.pathname);</script> was not found on this server.</p></body></html>"
ErrorDocument 500 "Server in update. Please comme back later."
Você não quer '^ / include (/.*)?$'
Esta parte é uma suposição, mas o que aconteceria se você colocar o RedirectMatch acima do bloco. Dessa forma, você não faria por negar acesso (proibir) a um pedido antes de redirecionar o pedido para 404.
A melhor e maneira simples é o seguinte:
1 - Inserir na sua conf principal (ie mundo VHost Fora):
<IfModule mod_alias.c>
RedirectMatch 404 ^/myDirectory(?|\/)$
</IfModule>
com mydirectory = css, js, imagens ...
2 - Você pode definir um por diretório -Indexes como segue:
Permitir que o seu conteúdo directiva "DirectoryIndex" Apache para ser servido:
<Directory "/myPathtoMyWebDocRoot/">
Options Indexes
AllowOverride None
Order Allow, Deny
Allow from all
</Directory>
e Negar índice do diretório para os outros:
<Directory "/myPathtoMyWebDocRoot/myDirectory/">
Options -Indexes
AllowOverride None
Order Allow, Deny
Allow from all
</Directory>
com mydirectory = *, css, imagens, js, secreto, ... seguindo suas necessidades.
Este funciona como esperado para todos os arquivos / diretórios com nome iniciados por dot mesmo em subdiretórios:
<FilesMatch "^\..+">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
RedirectMatch 404 \/\..+$
Nesse caso, você não precisa usar Options -Indexes
Minha solução para parar de exibir o conteúdo do diretório lista como e exibir erro 404 é simples. Criar arquivo .htaccess no diretório raiz do seu projeto e escrever os diretórios que devem ser protegidos.
estrutura de diretórios
- your_root_directory
- .htaccess
- 404.html
- index.html
- app
- other files I do not want to show
- models
- other files I do not want to show
.htaccess
RewriteEngine On
RewriteRule ^app/ - [R=404,L]
RewriteRule ^models/ - [R=404,L]
ErrorDocument 404 /your_root_directory/404.html A segunda linha de acesso disallow .htaccess para os itens da lista no diretório do aplicativo e todos os seus subridectories.
A terceira linha de acesso disallow .htaccess para os itens da lista no diretório modelos e todos os seus subridectories.
A quarta da linha .htaccess define o nosso próprio erro 404 (se você não quiser mostrar apache erro padrão).
Lembre-se de limpar o cache do seu navegador quando você trabalha com .htaccess.