Introdução ao .htaccess

Uma introdução para despertar o interesse por este arquivo tão importante.

Este é um arquivo de configuração do Apache, servidor web.

Canivete suiço

O .htaccess é t ambém considerado um canivete suiço do Apache, pois é muito versátil e se pode fazer muito com ele.

Configuração no Apache

É o primeiro arquivo lido pelo Apache sempre que algum visitante entra no site/aplicativo. Ele funciona como um manual de instruções que diz para o Apache que pastas podem ser acessadas, que imagens podem ser visualizadas por outros sites, se as URL serão amigáveis com o mod_rewrite, se deve redirecionar para uma pasta ou arquivo e várias outras configurações.

Por conta da segurança ele é um arquivo iniciado com um ponto, que num servidor linux é um arquivo oculto.

Para que seja eprmitido o uso dos arquivos .htaccess num servidor precisamos configurar o Apache para isso:

No apache2.conf ou no httpd.conf

<Directory /var/www/>
...
    AllowOverride All
...

Então reiniciar o Apache

Impedir a listagem de diretórios

Quando termos alguns arquivos em um diretório e não queremos que eles sejam acessados diretamente, mas somente através de links no index.html ou index.php:

Criamos nesse diretório um arquivo .htaccess contendo a linha:

Options -Indexes

Usar URL amigáveis

Quando temos o módulo mod_rewrite do Apache habilitado, podemos habilitar as URL amigáveis com:

RewriteEngine On

Forçar download de arquivos de mídia

Quando temos em um diretório arquivos de midia e não queremos que sejam visualizados, mas ao contrário baixados

AddType application/octet-stream .zip .mp3 .mp4

Redirecionamento

Mapeiar todas as requisições que chegam no diretório atual ^(.*) para a pasta public/

RewriteRule ^(.*) public/$1 [L]

    %{REQUEST_FILENAME} -> Contém o nome do script requisitado
    %{REMOTE_ADDR} -> Contém o IP que enviou a requisição
    %{HTTP_REFERER} -> Contém o domínio que enviou a requisição
    %{QUERY_STRING} -> Contém somente QueryString da URL
    %{REQUEST_METHOD} -> Contém o método usado na requisição POST, GET, PUT, HEAD.

RewriteCond %{REQUEST_FILENAME} !-f -> Nesse caso sempre que for requisitado um arquivo (script) “-f” as regras de redirecionamento não serão aplicadas, porque estamos usando o carácter de negação “!“.

RewriteCond %{REQUEST_FILENAME} !-d -> Agora estamos verificando se foi requisitado um diretório “-d“, caso sim as regras de redirecionamento também não serão aplicadas, porque estamos usando o carácter de negação “!“.

Importante citar que as condições e regras são aplicadas na ordem em que são lidas no arquivo .htaccess, ou seja, de cima para baixo.

Ativar a engine de reescrita

RewriteEngine on

Se NÃO for um arquivo executar as regras

RewriteCond %{REQUEST_FILENAME} !-f

Se NÃO for um diretório executar as regras

RewriteCond %{REQUEST_FILENAME} !-d

Redireciona para index.php se atender as condições acima

RewriteRule ^(.*)$ index.php

Forçar o uso do SSL/HTTPS

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://seu-site.com.br/$1 [R,L]

Flag [L] regra se torna independente

Flag [NC] regrac case insensitive

RewriteRule ^(.*)$ index.php [L,NC]

$1 é o primeiro grupo capturado de sua expressão regular; ou seja, o conteúdo entre ( and ). Se você tivesse um segundo conjunto de parênteses em sua regex, $2 conteria o conteúdo desses parênteses. Aqui está um exemplo:

RewriteRule ([a-z0-9/-]+)-([a-z]+).html$ $1-$2.php [NC,L,QSA]

Digamos que um usuário navegue para hello-there.html. Eles seriam servidos hello-there.php. Em sua string de substituição, $1 contém o conteúdo do primeiro conjunto de parênteses (hello), enquanto $2 contém o conteúdo do segundo conjunto (there). Sempre haverá exatamente tantos valores de "dólar" disponíveis em sua string de substituição quanto conjuntos de parênteses de captura em sua regex.

Se você tiver parênteses aninhados, digamos, (([a-z]+)-[a-z]+), $1 sempre se refere à captura mais externa (neste caso, toda a regex), $2 é o primeiro conjunto aninhado e assim por diante.

Exemplos para redirecionamento

Do raiz

Enable the mod_rewrite

RewriteEngine on

Redirect all requests to the public/ directory

RewriteRule ^(.*) public/$1 [L]

Redireciona para o public/

Do public/

Options -MultiViews
RewriteEngine On
Options -Indexes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Redireciona para o index.php de public/

Referências