Linux/Apache - Reescrevendo URLs no padrão wordpress ou extensão html com .htaccess e php.


Está ai algo bem interessante e que eu passei certo tempo pesquisando. Para quem não pretende utilizar frameworks, como wordpress por exemplo, para criar web sites mas gosta bastante do modelo de url que estas ferramentas disponibilizam esta dica é bem interessante.

Esta técnica também permite criar diretórios lógicos, ou seja, ao invés de criar pastas para colocar seus arquivos esta técnica permite que os diretórios sejam interpretados como parâmetros.

Para isto utilizamos um arquivo chamado .htaccess do Apache.

O .htaccess nada mais é do que um arquivo colocado em qualquer pasta do seu servidor Apache que serve para modificar as regras padrão de busca e interpretação de arquivos, ou seja, podemos mudar o comportamento de como o Apache faz a busca quando digitamos um endereço no browser.

Hoje vou apresentar um exemplo muito simples mas extremamente útil e que eu mesmo utilizo em meus projetos. Este truque me ajudou a manter a antiga estrutura que eu utilizava, sem a necessidade de instalar nenhum tipo de framework e ao mesmo tempo garantiu a flexibilidade na interpretação de arquivos.

Mas, afinal, o que quero dizer com isto?

Vamos a um exemplo então:

Implementando


A primeira regra é: fazer uma cópia do arquivo .htaccess que já está la no seu servidor. Escolha uma pasta qualquer, de preferencia crie uma só para testes. Se for utilizar uma pasta que já existe então faça uma cópia de seu arquivo .htaccess atual. Este arquivo influencia o comportamento de todas as demais pastas abaixo de sua estrutura.

O .htaccess trabalha baseado em expressões regulares quando queremos fazer reinterpretação de endereços.

Vamos começar fazendo com que todos os scripts .php possam ser lidos como se fossem arquivos .html ou como diretórios 'nome-do-diretorio/'.

O nosso arquivo base em php será o 'teste-htaccess.php', cujo código segue abaixo:

<!DOCTYPE html><html> <head> </head> <body> <div class="teste"> <?php echo  (isset($_GET['param']))? $_GET['param'] : $_GET['param'] ; ?> </div> </body></html>

Se acessarmos a página normalmente

http://localhost/teste/teste-htaccess.php?param=teste-de-sistema

Ele nos retornará normalmente a string 'teste-de-sistema'

Agora nosso objetivo é transformar a url acima nisto:

http://localhost/teste/teste-de-sistema.html

Obtendo o mesmo efeito, ou seja, o nome do endereço será o próprio parâmetro de entrada. Então, como fazemos isto?

Bem, temos de trabalhar com o arquivo .htaccess
O código abaixo será nosso primeiro teste

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ teste\-htaccess\.php\?param\=$1

'RewriteEngine' permite que a URL seja reescrita conforme a expressão regular que usarmos.
'RewriteCond %{REQUEST_FILENAME} !-f' e
'RewriteCond %{REQUEST_FILENAME} !-d'
filtram a expressão de modo que se um arquivo físico existir no servidor no endereço da url ao invés da reescrita o apache acessará o aquivo.

'RewriteRule' é nossa regra para reescrita caso não exista nenhum aquivo físico no mesmo caminho digitado na url.

'RewriteRule' trabalha da seguinte maneira 'RewriteRule origem destino', onde '^(.+)$' lê tudo que está na url a partir do nome do diretório e 'teste\-htaccess\.php\?param\=$1' é o destino, ou seja, tudo que é pego em (.+) é enviado como parâmetro para '?param'.

Em nosso exemplo se digitarmos 'http://localhost/teste/teste-de-sistema' 'teste-de-sistema' será lido e enviado como parâmetro para 'teste-htaccess.php', ou seja, 'teste-htaccess.php?param=teste-de-sistema'.

O problema aqui é que qualquer coisa que digitarmos será enviado como parâmetro, incluindo vários níveis de 'diretórios'.

Vamos filtrar a leitura de modo que apenas sejam aceito os padrões 'http://localhost/teste/esta/teste-de-sistema', 'http://localhost/teste/esta/teste-de-sistema/' e 'http://localhost/teste/esta/teste-de-sistema.html'

O código abaixo será nosso próximo teste:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(([\w-]|\/|\.html)+)$ teste\-htaccess\.php\?param\=$1

Onde ^(([\w-]|\/|\.html)+)$ lê tudo que termine em 'teste-de-sistema/', 'teste-de-sistema.html' e 'teste-de-sistema'

A base da reescrita de url está feita. vamos apenas aprimorar um pouco nosso script php.

<!DOCTYPE html><html> <head> </head> <body> <div class="teste"> <?php if  (isset($_GET['param']))  { $_GET['param'] = preg_replace('/(\/$|\.html)/','',$_GET['param']); var_dump(explode('/',$_GET['param'])); } ?> </div> </body></html>

Acima, o script php filtra o '.html' e pega o parâmetro e o quebra em blocos.

A url 'http://localhost/teste/esta/teste-de-sistema', http://localhost/teste/esta/teste-de-sistema.html e 'http://localhost/teste/esta/teste-de-sistema/' vão resultar em

array(2) { [0]=> string(4) "esta" [1]=> string(16) "teste-de-sistema" } 

que podem ser utilizados como parâmetro de entrada para leitura de um registro do banco de dados, etc.

Este padrão de reescrita também é interessante para não englobar arquivos tipo .js, .css, .jpg e etc. Em alguns casos pode ser interessante fazer esta substituição mas para efeito de nosso exemplo não será necessário.

Se quisermos melhorar ainda mais nosso .htaccess para, por exemplo, permitir o padrão '.html' e não permitir coisas como '.htmlx'

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(([\w-]|\/|\.html{0,1}$)+)$ teste\-htaccess\.php\?param\=$1

'l{0,1}$' faz com que possamos ou não incluir o 'l' no htm.
Assim chamar .html ou .htm serão permitidos mas .htmx ou .htmluuuu não serão permitidos.

Assim, temos nosso padrão worpress para as url's.

Comentários

Postagens mais visitadas deste blog

PHP - Utilizando proxy e CURL para acessar servidores ou sites

MySQL - Cálculo de período de tempo entre duas datas com TIMESTAMPDIFF

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()