Comprueba en masa cientos de redirecciones desde consola

Continuamos con la verificación de redirecciones vía consola ampliando lo visto en la primera parte de esta serie.

¿Qué sabíamos hasta ahora?

Gracias al fichero check301.sh podemos verificar redirecciones manualmente una a una.

check301.sh https://seocom.agency/test1

HTTP/2 301
location: https://seocom.agency/test2
HTTP/2 301
location: https://seocom.agency/test3
HTTP/2 301
location: https://seocom.agency/
HTTP/2 200

El siguiente paso consiste en poder hacer de forma automática la verificación de que un grupo de urls hace una redirección a otro grupo de urls concretas.

¿Cómo montamos el test?

Ante todo necesitamos tener a nuestra disposición el listado de urls origen y el destino al cual deben llevar si accedemos a ellas.

Creamos un fichero de texto con el siguiente formato

https://www.domain.tld/source-path/page.apx#https://newdomain.com/destination-path

Básicamente cada línea contiene la url original y la url final separadas por un símbolo de parrilla (#)

Podemos añadir tantas líneas como sea necesario.

¿Y cómo ejecutamos el test?

Ahora que ya tenemos todo el contenido a testear vamos a crear el script encargado de procesar el fichero de test.

Creamos un nuevo script con el nombre, por ejemplo, test301.sh

#!/bin/bash

while IFS="#" read -r fromUrl toUrl; do
    if [ -n "$fromUrl" ]
    then
        finalUrl=`curl -kILSs "$fromUrl" | grep "[Ll]ocation"|tail -n1|awk '{print $2}'`

        # This parameter expansion expression is necessary to remove the ^M that exists in fromUrl.
        finalUrl=${finalUrl%$'\r'}

        if [ "$finalUrl" != "$toUrl" ]
        then
            echo "$fromUrl doesn't redirecto to $toUrl"
        fi
    fi
done

Explicando el contenido del script

while IFS="#" read -r fromUrl toUrl; do

Hacemos un bucle de lectura línea a línea del fichero mediante la instrucción read de consola.

Con IFS (Internal Field Separator) le indicamos a read que las líneas están separadas con un símbolo de parrilla (#) y que asigne cada parte a una variable «fromUrl» y «toUrl» independiente.


if [ -n "$fromUrl" ]

Aseguramos que la variable fromUrl contenga datos, si no tiene datos ignoramos la línea.


finalUrl=`curl -kILSs "$fromUrl" | grep "[Ll]ocation"|tail -n1|awk '{print $2}'`

Ejecutamos la instrucción curl tal y como vimos en el artículo anterior pero sólamente captamos los Location con el grep.

Mediante tail descartamos todos los Location a excepción del último.

Y finalmente con awk obtenemos la url. Awk por defecto entiende que las líneas están separadas por espacios.

Al recibir una línea tal que:

Location: https://seocom.agency/

La separa en «Location» y «https://seocom.agency/». Como le pedimos que nos devuelva el segundo campo ‘{print $2}’ retorna «https://seocom.agency»

Finalmente toda la ejecución de los comandos combinados curl | grep | tail | awk se asigna a la variable finalUrl


finalUrl=${finalUrl%$'\r'}

Esta instrucción está como salvaguarda, elimina el carácter nueva línea «\r» al final que puede aparecer si el fichero csv301 se ha creado mediante un sistema Windows. Si dejamos ese carácter lo entenderá como dentro de la url y no funcionará ninguna.


if [ "$finalUrl" != "$toUrl" ]
then
    echo "$fromUrl doesn't redirecto to $toUrl"
fi

Con este bloque final comprobamos que la url final detectada coincida con la url esperada. Si no es el caso mostramos un mensaje por consola.

Ejecutando el proceso de verificación

Nos aseguramos que el fichero sea ejecutable.


chmod +x test-301.sh

Con esto ahora ya podremos ejecutar el script test301.sh sobre el fichero de urls.

Por ejemplo si creamos un fichero csv301 con estas urls a verificar:


https://seocom.agency/test1#https://seocom.agency/
https://seocom.agency/test2#https://seocom.agency/test3

Lanzaremos el test de la siguiente forma:


./test-301.sh < csv301

Y obtendremos el siguiente resultado:


https://seocom.agency/test2 doesn't redirecto to https://seocom.agency/test3

El script detecta que /test1 redirige correctamente a la url final y no muestra nada.

Pero /test2 no funciona porque la dirección final es la raíz del site en lugar de /test3. Esto nos evitará problemas con redirecciones que se redirigen en otro lugar.

El script comprueba las direcciones finales y no las intermedias.

Conclusiones

Aquí acabamos esta serie de dos partes acerca de las redirecciones y su comprobación mediante consola sin utilizar herramientas externas.

Con estos sencillos scripts podemos realizar la comprobación inicial de los datos que nos solicitan desde el equipo SEO y así asegurar que lo que nos piden funciona correctamente.