Quando um utilizador introduz um URL específico num browser e prime Enter, o servidor Web que recebe o pedido tenta encontrar um ficheiro no servidor no caminho especificado no URL. Se nada for encontrado no caminho, é aberto um ficheiro de índice, como index.html ou index.php. Se nada for encontrado, é devolvido um erro 404. Não teríamos URLs bonitos e fáceis de compreender se as coisas não funcionassem da forma como funcionam atualmente. Estes URLs são utilizados em muitos sítios. O módulo apache mod rewrite foi projetado para resolver esse problema. Neste tutorial, veremos como habilitá-lo.
Se tudo funcionasse como descrito, então ao abrir qualquer link deste site no diretório raiz deveria existir um arquivo ou script com o mesmo nome da barra de endereços. Mas não é o caso. Ao pedir este URL, o servidor web tenta encontrar esse ficheiro, mas se não o encontrar, em vez de devolver um erro 404, passa o controlo para o módulo mod_rewrite, que para todos esses URLs executa o script index.php, passando-lhe a query string depois do domínio. O PHP utiliza então estes dados para encontrar e devolver a página de que o utilizador necessita.
Para ativar o mod rewrite, execute um comando simples:
$ sudo a2enmod rewrite
Depois de reiniciar o servidor web:
$ sudo systemctl restart apache
O facto de o módulo estar ativado ao nível do servidor Web Apache não significa que funcione para um sítio Web. Para o efeito, deve ser configurado no ficheiro .htaccess, especificar em que script passar os pedidos para páginas inexistentes. Para que o ficheiro .htaccess funcione, a diretiva AllowOwerride: All
deve ser adicionada à secção Diretory do anfitrião virtual
Como exemplo:
Em seguida, por exemplo, no WordPress, é necessário adicionar linhas como esta ao ficheiro .htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Todo o código é colocado na diretiva IfModule, permitindo que o código dentro dela seja executado apenas quando o módulo mod_rewrite está ativado, caso contrário estas linhas são simplesmente ignoradas. A diretiva RewriteEngine On ativa o módulo para o diretório atual. Em seguida, RewriteBase especifica que toda a string após o domínio deve ser passada para o script. A seguir vêm as regras RewriteRule com condições para elas RewriteCond, que são executadas de forma estritamente sequencial.
Uma das regras RewriteRule ^index .php$ - [L]
diz que se o URL contiver index.php, o URL deve ser reescrito para /. Nesta expressão regular, a cadeia inteira é especificada e o ponto é escapado com uma barra invertida. O sinalizador [L]
significa que o URL corresponde a esta regra, então as regras seguintes não devem ser verificadas. Depois de esta regra ser executada, o URL será reescrito e o servidor Web assumirá que recebeu o pedido /, a análise da regra começará novamente e, desta vez, corresponderá à última regra.
As condições de RewriteCond aplicam-se a todas as regras subsequentes. Assim, temos RewriteCond %{REQUEST_FILENAME} !-f
e RewriteCond %{REQUEST_FILENAME} !-d
que permitem que a última regra seja executada apenas se o URL não for um ficheiro ou pasta. A regra final redirecciona tudo para o script ./index.php.
Se não conseguir compreender as definições do mod_rewrite, vale a pena ver o que se passa dentro do servidor Web durante os redireccionamentos. Para isso, na configuração do host virtual do site, é necessário adicionar esta linha.
Por exemplo:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Depois, no ficheiro de registo, que é fornecido na diretiva ErrorLog, verá todas as tentativas do servidor Web para converter o URL de acordo com as suas regras e poderá compreender o que está a fazer de errado. Neste tutorial, abordámos a forma de ativar o mod rewrite do Apache, bem como a forma como tudo funciona e como procurar erros.