Aprende a hacer todo tipo de redirecciones con parámetros en apache para optimizar tu sitio web para los motores de búsqueda.
Aunque tengo desarrolladas unas magníficas herramientas para hacer redirecciones desde el servidor, todavía me falta mejorarlas y añadirles funciones. Cuestión que está en marcha.
Una de las carencias de esta herramienta actualmente es a la hora de redireccionar con parámetros, ya que, ni mod_alias, ni RedirectMatch reconocen lo que sería una Query String (lo que se conoce como parámetro). Afortunadamente si se pueden hacer un gran conjunto de redirecciones de parámetros, con el maravilloso mod_rewrite, así que mostraré unos cuantos ejemplos, que entendiendo cada uno de ellos y modificándolos para cada necesidad específica, nos valdrá para redireccionar parámetros en Bulk, de cualquier forma para que nos sea rápido y cómodo.
Para entender cómo redireccionar los parámetros, tenemos que tener un mínimo conocimiento de qué son o cómo funcionan, aunque para hacer sencillo el post simplificaré el concepto.https://carlos.sanchezdonate.com/?todo-lo-que-venga-despues-de-interrogacion
Cada vez que haya una URL que tenga una interrogación, es una URL parametrizada, y podríamos decir que todo lo que vaya después de esa interrogación es el parámetro.
Por defecto, en una URL un parámetro no modificará el contenido de la página, por lo que mostrará el mismo contenido siendo una URL diferente. Por eso es importante configurar un Self-Canonical.
Los parámetros tienen infinidad de funciones. Con parámetros se puede: ordenar contenido; filtrar contenido; restringir contenido; segmentar por región; traquear información; paginar contenido; segmentar por idioma; hacer A/B testing; optimizar contenido de la caché e incluso forzar ciertas herramientas de rastreo entre otras aplicaciones.
Son un aliado muy poderoso para un desarrollador web y para un SEO Técnico.
Los parámetros en el SEO son mucho más que lo que significaba utilizar la herramienta de parámetros de G Search Console, tenemos que tenerlo muy en cuenta sobre todo para las analíticas, por eso hasta el propio Google desarrolló un generador de parámetros (para que sea más fácil traquear con Analytics).
Tenemos que tener en cuenta que, aunque Google cada vez los entiende mejor, pueden ofrecer contenidos totalmente distintos e incluso traducciones. Por eso, es importante tener un amplio conocimiento de las metaetiquetas y tener previsto un self-canonical, por si en nuestra web entran añadiendo parámetros inesperados, que no se tome como una URL de contenido diferente.
Todos los códigos que pongo aquí deberían ir en el archivo .htaccess del ROOT del proyecto, en el caso de que uses Apache como servidor. Siempre es recomendable hacer todos los cambios en un entorno de prueba previamente, para asegurarnos que no se están indicando directrices contradictorias al propio servidor.
Todas estas redirecciones tendrán un código similar a este. Pongo este como ejemplo de plantilla para explicar como funciona y pasamos a los ejemplos.<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/contacto/
RewriteCond %{QUERY_STRING} ([a-zA-Z0-9])
RewriteRule (.*) $1otraurl-%1/ [R=301,L,QSD]
</IfModule>
Todas estas redirecciones irán dentro de un <ifmodule mod_rewrite.c> dando por hecho que está puesto previamente el código RewriteEngine On.
Hay que tener en cuenta que el orden de los códigos en el .htaccess para evitar conflictos.
Los comandos principales que utilizaremos serán:
%{REQUEST_URI}: Sirve para indicar a que URL nos referimos. Es decir la URL a redirigir.
%{QUERY_STRING}: Sirve para indicar que debe haber en el parámetro a redirigir.
RewriteRule: Sirve para indicar el destino de la redirección.
Con esto y un poquito de Regex se puede hacer auténtica magia.
%1: Retorna el valor de las coincidencias recogidas en los Rewritecond. El 1 indica el número de grupo Match del Regex.
$1: Retorna el valor de la URI afectada. El 1 indica el número de grupo Match del Regex.
([a-zA-Z0-9]): Todos los caracteres alfanuméricos.
(.*): Todos los caracteres.
En cualquier caso, mostraré unos cuantos ejemplos para que se entienda el potencial que pueden tener estas redirecciones, que nos pueden servir para múltiples propósitos. Especialmente en las migraciones.
Aconsejo probar las expresiones regulares con Regex101. Y tener en cuenta si en nuestra URL a redireccionar hay algún carácter especial o espacio.
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} parametroA
RewriteRule (.*) $1?ParametroB [R=301,L,QSD]
</IfModule>
Con esto se consigue que toda URL que contenga el parámetro: parametroA se rediriga a parametroB
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/contacto/
RewriteCond %{QUERY_STRING} parametroA
RewriteRule (.*) /contacto/?ParametroB [R=301,L,QSD]
</IfModule>
Imaginemos que se ha configurado mal el Campaign URL Builder para ads, y que en vez de google se puso gogle, lo cual está alterando todas las analíticas (pongo este caso entre otros muchos que podrían pasar).
Una solución pasaría por aquí:<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} utm_source=gogle(.*)
RewriteRule (.*) $1?utm_source=google%1 [R=301,L,QSD]
</IfModule>
De esta forma conseguiremos que en toda la web, todas las URL que vayan a esa versión de parámetro se redirijan a la correcta. Pasando de:
http://sanchezdonate.test/contacto/?utm_source=gogle&utm_medium=cpc&utm_campaign=jobs&utm_id=pruebaa
http://sanchezdonate.test/contacto/?utm_source=google&utm_medium=cpc&utm_campaign=jobs&utm_id=pruebaa , esta solución te permite corregir errores de tipeo en ciertos filtros en masa.
Ahora, puede ocurrir que estemos buscando reemplazar absolutamente todo parámetro que contenga la palabra gogle por Google, reemplazando solo esa palabra (no resignándonos sólo a copiar todo el inicio hasta llegar a dicha palabra para reemplazar).
Así sería la solución más óptima:<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} (.*)(gogle)(.*)
RewriteRule (.*) $1?%1google%3 [R=301,L,QSD]
</IfModule>
Recordemos que puedes jugar todos estos valores con todo lo que hay en el post. Por lo que puedes hacer infinitos tipos de combinaciones. Puedes designar esto para que ocurra sólo en una URL específica por ejemplo.
Esto vale para solucionar errores del Campaign URL Builder o cuando se hace un cambio en como funcionan los filtrados o del desarrollo previo.<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/brooks/glycerin-20/
RewriteCond %{QUERY_STRING} key=value-([0-9]+)
RewriteRule (.*) /brooks/glycerin-20/?talla-%1 [R=301,L,QSD]
</IfModule>
De esta forma, lo que haremos será cambiar de https://example.com/brooks/glycerin-20/?key=value-44 a https://example.com/brooks/glycerin-20/?talla-44.
Como siempre, con Request_URI podemos seleccionar que sea de una página página en específico, o si no lo ponemos que funcione en cualquiera.
Pongamos un ejemplo. Queremos que todas las URL que vengan de Facebook, que tiene un parámetro ?fbclid= se muevan a nuestro Linktree por alguna razón, pero queremos que se mantenga el parámetro para mantenerlo registrado.
Entonces, podemos hacer que "todo lo que contenga fbclid", se mueva a linktree manteniendo el parámetro. Pero claro, si mantiene el parámetro, se redirigirá a a nuestro linktree indefinidamente, causando un error de "too many redirects"
Para evitar que se forma un bucle, lo que podríamos hacer es un "does not contain" en el Request URI, entonces "todo lo que no sea linktree con el parámetro fbclid, se moverá a linktree trayendose el parámetro consigo".<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(linktree)/ [NC]
RewriteCond %{QUERY_STRING} (fbclid)(.*)
RewriteRule (.*) /linktree/?fbclid%2 [R=301,L,QSD]
</IfModule>
Puede ocurrir que queramos que todas las URL que tengan un parámetro en específico vayan a una URL. Sea porque nos vienen de un anuncio en específico que no tenemos control o por algo de la configuración de la web.<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} anuncios [NC]
RewriteRule (.*) /landingpage/ [R=301,L,QSD]
</IfModule>
En este caso, cualquier página con el parámetro ?anuncios o que contenga la palabra anuncios, iría directo a https://example.com/landingpage/
Puede sucedernos que encontremos una web que tuviese toda la arquitectura hecha con parámetros, como una inmobiliaria, y hayamos conseguido que se cambie por carpetas.
¿Cómo realizaríamos ese cambio de la forma más correcta?
En este supuesto, podemos imaginar que es una inmobiliaria online, donde para categorizar por ejemplo viviendas de alquiler en Cartagena la URL sería así:
https://example.com/?alquiler-viviendas-murcia-cartagena y queremos que redireccione, pero que además funcione con todas las provincias y ciudades sin tener que poner todas a mano, de forma que con una nueva arquitectura quede así: https://example.com/alquiler/viviendas/{provincia}/{ciudad} .
Esta sería la forma:<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} alquiler-viviendas-(.*)-(.*)
RewriteRule (.*) /alquiler/viviendas/%1/%2? [R=301,L]
</IfModule>
En este caso, he puesto la ? que hay en el RewriteRule se hace para evitar que sigan habiendo parámetros. De esta forma se pueden obtener unas redirecciones bastante funcionales.
Para versiones de Apache 2.4 o superiores sería más correcto quitar la interrogación y añadir la bandera QSD como de hecho he puesto en todos los ejemplos.<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} alquiler-viviendas-(.*)-(.*)
RewriteRule (.*) /alquiler/viviendas/%1/%2 [R=301,L,QSD]
</IfModule>
Con esto me refiero a que los parámetros se redirijan a la propia URL sin parámetro
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/contacto/
RewriteCond %{QUERY_STRING} ([a-zA-Z0-9])
RewriteRule (.*) /contacto/ [R=301,L,QSD]
</IfModule>
Con este ejemplo haríamos que todos los parámetros de la página de https://example.com/contacto/?loquesea se redirigiesen a https://example.com/contacto/ , es decir sin parámetro
Imaginemos que sólo queremos redireccionar los parámetros que nos lleguen con una nomenclatura en específico, por ejemplo ?key=value del contacto. Esta sería la forma:<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/contacto/
RewriteCond %{QUERY_STRING} key=value
RewriteRule (.*) /contacto/ [R=301,L,QSD]
</IfModule>
Con este ejemplo haríamos que todos los parámetros de la página de https://example.com/contacto/?key=value se redirigiesen a https://example.com/contacto/ , es decir sin parámetro, sin embargo, https://example.com/contacto/?loquesea se quedaría igual.
Si lo que se pretende es forzar una redirección de cualquier parámetro que contenga la palabra spam (por ejemplo) en cualquier URL, se haría así:<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} spam
RewriteRule (.*) $1 [R=301,L,QSD]
</IfModule>
mientras que si lo que se pretende es que no existan los parámetros en toda la web (no lo recomiendo especialmente, pero puede ocurrir por algo) sería así:<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} [a-zA-Z0-9]
RewriteRule (.*) $1 [R=301,L,QSD]
</IfModule>
No hay un motivo SEO de peso para realizar esta acción, pero si en algún momento se necesita que no existan de ninguna forma los parámetros de una URL en Particular, estas sería la formas:
Con este código haríamos que todos los parámetros de la página contacto dejasen de existir, forzando un 404.
He puesto [a-zA-Z0-9] en Query String en vez de (.*) porque si no la propia página de contacto también arrojaría un código de respuesta 404<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/contacto/
RewriteCond %{QUERY_STRING} [a-zA-Z0-9]
RewriteRule ^ - [R=404]
</IfModule>
De esta forma podríamos por ejemplo forzar un 404 a todos los parámetros que tuviesen la palabra "facebook":<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} facebook
RewriteRule ^ - [R=404]
</IfModule>
Esta práctica puede ser muy útil en algún caso donde se quiera parametrizar una imagen por cuestiones como el cache del usuario y el código de la web aún no lo permita fácilmente.
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/img/imagen\.jpg$
RewriteCond %{QUERY_STRING} !^parametro$
RewriteRule ^img/imagen\.jpg$ /img/imagen.jpg?parametro [R=302,L,QSD]
Nótese la importancia del query_string en este caso, ya que por medio de la exclamación "!" está añadiendose una excepción, para que de esta forma el rewriterule no funcione cuando el parámetro sea literalmente "?parametro", de esta forma como lo que estamos haciendo finalmente es redirigir todas las rutas posibles de esa imagen a su versión con el parámetro "parametro" evitamos una cadena de redirecciones.
Nota importante: WordPress tiene una configuración muy específica dentro de la carpeta wp-content, este tipo de redirección no va a funcionar dentro de esa carpeta a menos que añadamos hooks específicos debido al core del propio CMS y a cómo está planteado.
Con todos los ejemplos aquí expuestos, más las explicaciones se pueden hacer innumerables combinaciones para cualquier caso específico.
TODOS LOS CÓDIGOS AQUÍ EXPUESTOS ESTÁN TESTEADOS Y PROBADOS ANTES DE LA PUBLICACIÓN PARA EVITAR ERRORES. No obstante no me hago responsable de malas implementaciones que se hagan por desconocimiento.
Para todos estos ejemplos se ha utilizado la versión 2.4.47 de Apache y todos los códigos funcionan correctamente.
Importante: El orden del código en un .htaccess es de vital importancia. Realiza los cambios con alguien que sepa o con ayuda de la IA, y nunca en el entorno en producción.
Te falta mi máster. Accede a una formación avanzada que te permitirá aplicar e implementar SEO en cualquier tipo de WEB
¡Accede al Máster de SEO Técnico!