Sin duda, el SEO (Search Engine Optimization) es uno de los principales factores estudiados por los desarrolladores web en la actualidad, ya que es el responsable directo de cómo el sitio web atraerá nuevos visitantes y su posicionamiento en buscadores como Google, Yahoo, Bing y otros.

Hace algún tiempo, los desarrolladores web no se preocupaban por la semántica de la URL de sus páginas y era normal encontrar algo como http://www.site.com.br/noticia.php?id=587. Con el avance del SEO y la mejora de las herramientas de búsqueda, el concepto de URL amigable, que consta de URL en el formato http://www.site.com.br/noticia/587/url-semantica-vira-tendendia-no-mercado-web o incluso http://www.site.com.br/url-semantica-vira-tendendia-no-mercado-web.

Además de tener más sentido para el usuario, que puede tener una idea del contenido del enlace incluso antes de hacer clic, los motores de búsqueda pueden usar la propia URL para iniciar el proceso de indexación del contenido y comparar la URL con el título de la página y la etiqueta H1 para comprobar si todos están hablando del mismo tema.

En este post te ayudaré a utilizar estos recursos en tus proyectos.

Preparación de la Dirección de solicitudes

La primera parte de implementar una URL amigable es dirigir las solicitudes a un archivo en nuestro sistema para manejar estas solicitudes, que en teoría no existen (no existe ningún archivo llamado url-semantica-vira-tendendia-no-mercado-web en tu proyecto)

En el código siguiente, puse como prefijo algunas extensiones para evitar el uso del archivo url_amigavel.php, que son extensiones de archivo y ciertamente no utilizan URL amigables. En este caso, si algún archivo en estas extensiones no existe, se tratará mediante ErrorDocument, que expliqué en el post. Redirigir errores HTTP usando .htaccess

.htaccess

<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>

Preparar la tramitación de solicitudes.

En esta etapa, el cliente habrá realizado la solicitud de nuestra URL amigable, que habrá sido dirigida a nuestro archivo PHP que manejará la URL.

url_amigavel.php

<?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:administrador@seudominio.com.br'>Administrador do Sistema.</a>
</p>";
}

?>

URL de ejemplo: www.seusite.com.br/subcategoria/20/tv-lcd
Ejemplo de retorno: Matriz ( [0] => subcategoría [1] => 20 [2] => tv-lcd )

Mostrar contenido en archivos de ruta

En el caso del ejemplo anterior, el archivo subcategoría.php es mi archivo de ruta que fue llamado a través del archivo url_amigavel.php que consultará la base de datos y mostrará la información en el navegador al usuario. Veamos cómo nuestro archivo identificará los parámetros ingresados:

subcategoría.php

<?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 );
}

?>

Generando la URL amigable para mostrar en el sitio web

Una vez que la estructura está lista para trabajar con URL amigables, viene la parte principal, que consiste en cambiar las URL de su sitio web al formato de URL amigable.

Si desarrolla utilizando el patrón de diseño MVC, esto no será demasiado trabajo. Simplemente crea una función en cada uno de tus modelos con un código similar a este, donde la URL se compone del ID del objeto y el nombre (que puede ser título, descripción, lo que sea... lo que sea que uses en tu proyecto para nombrar el objeto)

Subcategoría.php (Modelo)

public function retornaUrlAmigavel() 
{
    $nome_seo = clsUtil::gerarTituloSEO($this->nome);
    return "{$_SERVER['HTTP_HOST']}/subcategoria/" . $this->id . "/$nome_seo";
}

Si aún desarrollas de forma estructurada (Estudiar Orientación a Objetos y MVC), tendrás que crear una función y cambiar todo tu sitio web para que cada vez que escribas una URL en tu HTML final, utilice esta función para eso.

Ejemplo:

public function retornaUrlAmigavelGenerica($arquivo, $id, $nome) 
{
    $nome_seo = clsUtil::gerarTituloSEO($nome);
    return "{$_SERVER['HTTP_HOST']}/{$arquivo}/{$id}/$nome_seo";
}

Función utilizada para formatear el nombre para que esté en formato URL amigable

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;


}

¿Y la URL www.seusite.com.br/tv-lcd?

En este post mencioné también un tipo de URL amigable muy común, que es el formato www.seusite.com.br/tv-lcd por ejemplo. Este tipo de URL amigable es un poco más complicado de implementar, ya que en la URL no se proporcionaba un ID para que puedas consultar directamente en la base de datos, solo el texto.

Para esta implementación, necesitaremos crear un campo en la base de datos para almacenar la URL amigable generada, permitiéndonos consultar nuestra base de datos usando el título (tv-lcd) y así identificar a qué URL está asociado este título.

Normalmente, para esto se crea una tabla que contiene las URL amigables y las respectivas páginas que se mostrarán (usando include o require en PHP), ya que existen varios tipos diferentes de contenido (subcategorías, productos, categorías, noticias, etc.) y este enfoque no se limitaría a un solo tipo de contenido.

Otro enfoque (más sencillo) sería incluir el ID y el tipo de contenido al final de la URL, en el formato www.seusite.com.br/tv-lcd-subcategoria-20 y al manejar la solicitud de tu archivo subcategoria.php harías este cambio:

// 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];

Con lo que aprendió en esta publicación, puede implementar esto sin problemas. Si tienes alguna duda, deja tu comentario y te la responderé.

Consideraciones finales

Implementar una URL amigable en tu proyecto no será sencillo y rápido, como suelen serlo algunos cambios de SEO. Es realmente un poco trabajoso y costoso, especialmente si no estás acostumbrado al paradigma orientado a objetos y al patrón de diseño MVC.

El concepto de URL amigable es sumamente importante para el SEO, y cada vez es más común encontrar sitios web que utilizan este concepto. Aquellos que aún no se han sumado a esto (las URL amigables son una realidad desde hace unos años) ya están muy por detrás de sus competidores, así que no pierdan el tiempo.