Sem dúvida, o SEO (Search Engine Optimization) é um dos principais fatores de estudo dos desenvolvedores Web atualmente, uma vez que ele é responsável diretamente pela forma como o website atrairá novos visitantes e pelo posicionamento do mesmo em mecanismos de busca como o Google, Yahoo, Bing e outros.
Há algum tempo atrás, os desenvolvedores Web não tinham preocupação com a semântica da URL de suas páginas e era normal encontrar algo como http://www.site.com.br/noticia.php?id=587. Com o avanço do SEO e o aprimoramento de ferramentas de busca, foi criado o conceito de url amigável, que consiste em URL’s no formato http://www.site.com.br/noticia/587/url-semantica-vira-tendendia-no-mercado-web ou mesmo http://www.site.com.br/url-semantica-vira-tendendia-no-mercado-web.
Além de fazer mais sentido para o próprio usuário, que pode ter uma idéia do conteúdo do link antes mesmo de clicar, as ferramentas de busca podem utilizar a própria URL para já iniciar o processo de indexação o conteúdo e comparar a URL ao título da página e à tag H1 para verificar se todos estão falando sobre o mesmo assunto.
Neste post irei ajudá-los a utilizar esse recursos em seus projetos.
Preparando o Direcionando das requisições
A primeira parte da implementação de URL amigável é direcionar as requisições para um arquivo do nosso sistema tratar essas requisições, que, na teoria não existem (não existe um arquivo chamado url-semantica-vira-tendendia-no-mercado-web no seu projeto)
No código abaixo, eu prefixei algumas extensões para não tratar usando o arquivo url_amigavel.php, que são extensões de arquivos e que certamente não utilizam url amigável. Nesse caso, caso algum arquivo nessas extensões não exista, eles serão tratados utilizando o ErrorDocument, que expliquei no post Redirecionamento de erros HTTP utilizando o .htaccess
.htaccess
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<IfModule mod_rewrite.c> # Habilita o mod_rewrite RewriteEngine On # Caso a URL solicitada não seja um arquivo ou diretório... RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # E o arquivo solicitado não seja das extensões abaixo, # redireciona a requisição para o arquivo "url_amigavel.php" fazer o tratamento RewriteRule !\.(js|ico|txt|gif|bmp|jpeg|jpg|png|css|log|rss|zip|xml|sql|pdf|doc|docx|xls)$ url_amigavel.php </IfModule> |
Preparando o Tratamento das requisições
Nesta etapa, o cliente terá feito a requisição para a nossa URL amigável, que terá sido direcionada para o nosso arquivo PHP que irá tratar a URL.
url_amigavel.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php // Recupera a URL da requisição e seus parâmetros, separando em um vetor dividido pelo caracter "/" $geturl = explode( "/", str_replace( strrchr( $_SERVER["REQUEST_URI"], "?" ), "", $_SERVER["REQUEST_URI"] ) ); array_shift( $geturl ); // Considera o primeiro parâmetro como o arquivo php $tipo = $geturl[0]; // Se o arquivo existir, inclui na página. Caso contrário, devemos redirecionar o usuário para uma // tela amigável de error 404 if ( is_file( "$tipo.php" ) ) { include "$tipo.php"; } else { echo " <h1 class='corVermelho'>ERRO: Página não encontrada (Erro 404)</h1> <p> <strong>Página Solicitada: <em>{$_SERVER['REQUEST_URI']}</em></strong><br/><br/> Esta pasta ou página não pôde ser encontrada. Provavelmente ela foi renomeada, apagada ou simplesmente não existe. Por favor, verifique se o endereço digitado está correto e tente novamente. <br/><br/>Caso você necessite realmente de acessar esta pasta ou arquivo, entre em contato com o <a href='mailto:[email protected]'>Administrador do Sistema.</a> </p>"; } ?> |
Exemplo de url: www.seusite.com.br/subcategoria/20/tv-lcd
Exemplo de retorno: Array ( [0] => subcategoria [1] => 20 [2] => tv-lcd )
Exibindo o conteúdo nos arquivos de rota
No caso do exemplo acima, o arquivo subcategoria.php é o meu arquivo de rota que foi chamado através do arquivo url_amigavel.php que irá consultar o banco de dados e exibir as informações no navegador para o usuário. Vejamos como o nosso arquivo irá identificar os parâmetros informados:
subcategoria.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php // Recupera a URL da requisição e seus parâmetros, separando em um vetor dividido pelo caracter "/" $geturl = explode( "/", str_replace( strrchr( $_SERVER["REQUEST_URI"], "?" ), "", $_SERVER["REQUEST_URI"] ) ); array_shift( $geturl ); // Recupera o ID da subcategoria, informado na URL (2º parâmetro) e converte para inteiro $id = intval( $geturl['1'] ); if ( $id == 0 ) { // Caso o ID seja 0, vou listar as subcategorias para o usuário selecionar qual deseja visualizar $frmSubcategoria = new frmSubcategoria(); $frmSubcategoria->listar(); } else { // Caso o ID seja > 0, vou consultar os dados dessa subcategoria no banco de dados $ctrSubcategoria = new ctrSubcategoria(); $subcategoria = $ctrSubcategoria->recuperarObjetoBanco( $id ); // Agora que meu controller criou o objeto, vou exibir os ítens dessa sub-categoria $frmSubcategoria = new frmSubcategoria(); $frmSubcategoria->visualizar( $subcategoria ); } ?> |
Gerando a URL Amigável para exibir no site
Depois que a estrutura já está toda apta para trabalhar com URL amigável, vem a parte principal, que é alterar as URL’s do seu website pelo formato de URL amigável.
Caso você desenvolva utilizando o padrão de projeto MVC, isso não será muito trabalhoso. Basta criar uma function em cada um de seus models com o código similar a esse, onde a URL é composta pelo ID do objeto e o nome (que pode ser titulo, descricao, enfim… o que você utiliza no seu projeto para dar nome ao objeto)
Subcategoria.php (Model)
1 2 3 4 5 |
public function retornaUrlAmigavel() { $nome_seo = clsUtil::gerarTituloSEO($this->nome); return "{$_SERVER['HTTP_HOST']}/subcategoria/" . $this->id . "/$nome_seo"; } |
Caso você ainda desenvolva de forma estruturada (Estude Orientação a Objetos e MVC), você terá que criar uma function e alterar todo o seu site para que sempre que for escrever uma URL no seu HTML final, ele utilize essa função para isso.
Exemplo:
1 2 3 4 5 |
public function retornaUrlAmigavelGenerica($arquivo, $id, $nome) { $nome_seo = clsUtil::gerarTituloSEO($nome); return "{$_SERVER['HTTP_HOST']}/{$arquivo}/{$id}/$nome_seo"; } |
Função utilizada para formatar o nome de forma que fique no formato de URL Amigável
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public static function gerarTituloSEO( $strTitulo ) { /* Remove pontos e underlines */ $arrEncontrar = array(".", "_"); $arrSubstituir = null; $strTitulo = str_replace( $arrEncontrar, $arrSubstituir, $strTitulo ); /* Caracteres minúsculos */ $strTitulo = strtolower( $strTitulo ); /* Remove os acentos */ $acentos = array("á", "Á", "ã", "Ã", "â", "Â", "à", "À", "é", "É", "ê", "Ê", "è", "È", "í", "Í", "ó", "Ó", "õ", "Õ", "ò", "Ò", "ô", "Ô", "ú", "Ú", "ù", "Ù", "û", "Û", "ç", "Ç", "º", "ª"); $letras = array("a", "A", "a", "A", "a", "A", "a", "A", "e", "E", "e", "E", "e", "E", "i", "I", "o", "O", "o", "O", "o", "O", "o", "O", "u", "U", "u", "U", "u", "U", "c", "C", "o", "a"); $strTitulo = str_replace( $acentos, $letras, $strTitulo ); $strTitulo = preg_replace( "/[^a-zA-Z0-9._$, ]/", "", $strTitulo ); $strTitulo = iconv( "UTF-8", "UTF-8//TRANSLIT", $strTitulo ); /* Remove espaços em branco */ $strTitulo = str_replace( " ", "", $strTitulo ); /* Remove preposições */ $strCaracterSeparador = "-"; $arrEncontrar = array("-a-", "-e-", "-i-", "-o-", "-u-", "-p-", "-em-", "-de-", "-do-", "-da-", "-dos-", "-das-", "-com-", "-um-", "-uma-", "-para-"); $arrSubstituir = $strCaracterSeparador; $strTitulo = str_ireplace( $arrEncontrar, $arrSubstituir, $strTitulo ); return $strTitulo; } |
E a URL www.seusite.com.br/tv-lcd ?
Neste post, eu mencionei um tipo de URL amigável muito comum também, que é o formato www.seusite.com.br/tv-lcd por exemplo. Esse tipo de URL amigável é um pouco mais complicado de implementar, uma vez que não foi informado um ID na URL para você consultar direto no banco de dados, apenas do texto.
Para essa implementação, precisaremos criar um campo no banco de dados para guardar a URL amigável gerada, permitindo consulta nossa base de dados através do título (tv-lcd) e identificando assim, qual URL esse título está associado.
Normalmente, é criada uma tabela para isso, contendo as URL amigáveis e as respectivas páginas que serão exibidas (utilizando include ou require no PHP), pois existem vários tipos de conteúdos diferentes (subcategorias, produtos, categorias, noticias, etc) e essa abordagem não ficaria restrita a apenas um tipo de conteúdo.
Uma outra abordagem (mais fácil), seria incluir o ID e o tipo do conteúdo ao final da URL, no formato www.seusite.com.br/tv-lcd-subcategoria-20 e na hora de tratar a requisição do seu arquivo subcategoria.php você faria essa alteração:
1 2 3 4 5 6 |
// Recupera a URL da requisição e seus parâmetros, separando em um vetor dividido pelo caracter "-" $geturl = str_replace("/", "", explode( "-", str_replace( strrchr( $_SERVER["REQUEST_URI"], "?" ), "", $_SERVER["REQUEST_URI"] ) ) ); $numParametros = count($geturl); $id = $geturl[$numParametros - 1]; $arquivo = $geturl[$numParametros - 2]; |
Utilizando o que você aprendeu nesse post, você consegue implementar isso tranquilamente. Caso tenha dúvidas, deixe o seu comentário que irei respondê-lo.
Considerações finais
Implementar URL amigável em seu projeto, não será algo simples e rápido, como algumas alterações de SEO geralmente são. É realmente um pouco trabalho e custoso, principalmente se você não está acostumado com o paradigma da orientação a objetos e o padrão de projetos MVC.
O conceito de URL amigável é extremamente importante para o SEO, e é cada vez mais comum encontrar websites que utilizem esse conceito. Quem não aderiu a isso ainda (URL amigável já é uma realidade há alguns anos), já está bem atrás dos concorrentes, então não perca tempo.