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>
Foi útil?

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 seção no .htaccess e dá os resultados esperados.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top