terça-feira, setembro 09, 2008

Permitir somente index.php pelo .htaccess

Apesar de haver vários frameworks, tem coisa que faço sem a utilização deles. Acho que isso é comum para desenvolvedores. É legal proibir o acesso direto do usuário aos arquivos do seu site, como uma imagem ou até mesmo um script que faça algo mais delicado como excluir_usuario.php, por exemplo. No Apache é fácil fazer isso usando o arquivo .htaccess.

Vamos lá:

Crie um arquivo .htaccess. Se for Windows, copie de um diretório que já exista e pague seu conteúdo, ou baixe um exemplo da internet. O Windows não deixa criar arquivo assim que ele considera sem nome (somente com extensão).

O Conteúdo dele seria assim:

# htaccess do Daniel - testando e evoluindo - v0.1

IndexIgnore *

Options +FollowSymlinks

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule !^index.php(.*)$ index.php$1 [L]
</IfModule>

<Files .htaccess>
order deny,allow
deny from all
</Files>


A primeira linha com IndexIgnore não deixa listar o conteúdo do diretório.
A linha do Options +FollowSymlinks é para o funcionamento do módulo de rescritra.
Se o módulo de escrita estiver ativado, usa ele para substituir qualquer chamada de arquivo diferente de index.php e chama o index.php com a querystring usada inicialmente, ou seja, se eu chamar daniel.php?a=ddd, chama o caminho index.php?a=ddd.
Depois ele proíbe o acess odireto ao .htaccess. Só isso.

É simples e atende minhas necessidades. Claro que pode ser que eu melhore (com sua ajuda inclusive), mas já é um começo para evitar surpresas desagradáveis.

Esse arquivo faz efeito para os subdiretórios também. Se você quiser alterar as regras deles, basta criar um .htaccess com elas. Em caso de não criar, deve-se criar um arquivo index.php que não faz nada, pois sempre haverá redirecionamento para o index.php de cada diretório. Ou então na regra do .htaccess, basta colocar para redirecionar não apra o index.php, mas para /index.php ou /site/index.php para sempre ir para o mesmo arquivo.

Abraço!!

2 comentários:

Anônimo disse...

Utilizo o index.php como o layout base, apenas dando include para as outras seções do site. Gostaria que os arquivos que são inclusos, não fossem acessíveis diretamente, apenas via requisões include (ou require). É possível fazer isso com o .htaccess? Qualquer informação a respeito será muito bem apreciada. Obrigado, bom post.

Daniel disse...

Sim. O exemplo de acesso é restrito ao usuário que somente pode acessar o index.php, ou a um frame na sua página, pois a requisição é via cliente. Usando "include" ou "require", o seu php tem acesso normal a estes arquivos.