Comenzamos en: 17d 8h 10m 39s
PLAZAS LIMITADAS

Redireccionar con parámetros en Apache

Aprende a hacer todo tipo de redirecciones con parámetros en apache para optimizar tu sitio web para los motores de búsqueda.

Autor: Carlos Sánchez
Temática: Servidores
Fecha de publicación: 2022-07-04
Última revisión: 2022-09-14

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.

¿Qué es un parámetro?

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.

Carlos Sánchez

¿Para qué sirven los parámetros?

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.

¿Cómo afectan los parámetros al SEO?

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.

Teoría de las Redirecciones con parámetro en htaccess

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.

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

Con esto y un poquito de Regex se puede hacer auténtica magia. 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.

Redirigir parámetros a otros parámetros

Parámetro A a Parámetro B

<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

Cambio de parámetro A a Parámetro B con una URL específica

<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/contacto/
RewriteCond %{QUERY_STRING} parametroA
RewriteRule (.*) /contacto/?ParametroB [R=301,L,QSD]
</IfModule>

Cuando solo se quiere cambiar una palabra del parámetro

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

a

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.

Parámetros con valor a otro

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.

Redireccionamiento de Parámetros a URL distintas

Mover los parámetros a otra URL y evitar un bucle

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>
Esto movería todos los que tengan el parámetro de fbclid menos el directorio linktree, para que si lo contenga, le quitamos el !

Toda la URL que contenga X palabra en su parámetro, que se mueva a esta página

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/

Convertir de parámetros a subdirectorios

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>

Redirigir a la URL Madre

Con esto me refiero a que los parámetros se redirijan a la propia URL sin parámetro

Redirigir todos los parámetros a la URL madre en una URL específica

<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

Redirigir un parámetro en específico de UNa URL a la madre en una URL específica

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.

Eliminar cualquier parámetro o un parámetro específico en cualquier URL

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>

Forzar 404 con parámetros

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:

404 en cualquier parámetro de una URL Particular

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>

404 a los parámetros que coincidan con algo en específico

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>

Configuraciones

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.

Bibliografía

Query String Reds by Jeff Starr

¿Quieres hacer el Master de SEO Técnico?

Accede a una formación avanzada que te permitirá aplicar e implementar SEO en cualquier tipo de WEB

¡Accede al Master de SEO Técnico!
Tal vez te interesen estos artículos: