Back-End

9 dez, 2009

Melhorando o formato das URLs do CodeIgniter em servidores Apache

Publicidade

Nesse artigo vou mostrar uma configuração específica do arquivo .htaccess para melhorar o formato das urls aceitas em projetos feitos com CodeIgniter em servidores apache.

No primeiro artigo da série sobre o framework, foi mostrado o arquivo de configuração (config.php), nele temos uma variável chamada “index_page” configurada com o valor default: “index.php”. Essa variável define o que vai na url antes do nome do controller e do método chamado. No caso do artigo anterior, usamos a url:

index.php/welcome/listar2

Esse era o método que criamos para o nosso exemplo de paginação. Como eu tenho um diretório que uso para artigos e dentro dele criei um projeto chamado exemplo, a url completa no meu caso é:

http://localhost/artigos/exemplo/index.php/welcome/listar2

O que vamos fazer nesse artigo é transformar essa url nesse formato:

http://localhost/artigos/exemplo/welcome/listar2

Pela lógica, bastaria apagar o conteúdo da variável index_page, retirando o valor “index.php”. Mas só isso não basta, pois o servidor retorna erro 404 dessa forma.

A reestruturação da url é interessante, já que ela fica mais amigável tanto para o usuário do site, como para robôs de busca (bom para SEO).

A configuração é simples, existem duas formas de se fazer isso. A primeira delas é criar um arquivo com o nome “.htaccess” com o seguinte conteúdo:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

Essas linhas abrem o arquivo ou diretório chamado na url, caso ele exista, caso contrário ele adiciona uma chamada para o index.php dessa url, ou seja, faz exatamente o que precisamos. O problema dessa regra é que os arquivos ficam acessíveis, chamando-se diretamente o caminho físico deles.

Outra forma de se fazer, mais segura também, é criar o mesmo arquivo (.htaccess) mas com regras diferentes:

RewriteEngine on
RewriteCond $1 !^(index\.php|css|js|img|robots\.txt)
RewriteRule ^(.*)$ /artigos/exemplo/index.php/$1 [L]

A diferença dessa regra é que ela especifica exatamente quais arquivos/diretórios não deverão receber a regra. No exemplo acima, caso seja um diretório css, js ou img, ou também um arquivo index.php ou robots.txt será mantida a chamada http sem mudanças, caso contrário faz exatamente o que a outra forma também faz: realiza a chamada para o respectivo index.php.

A única desvantagem dessa abordagem é que, caso seja necessária a criação de novos diretórios no servidor com arquivos de imagem, por exemplo, é preciso adicionar esse novo diretório na condição (separando-se com o pipe: ‘|’ e dando-se os escapes necessários em pontos separadores de extensões).

Alguns servidores apache não habilitam o mode rewrite por padrão, por isso é bom adicionar uma condição nas regras para saber isso, basta adicionar:

ou

Para o que é para se fazer em caso de haver ou não o suporte a reescrita de url… Segue abaixo a versão final do arquivo .htacces: