Saltar al contenido
crawlforgeEnglish
Se rompió12 de octubre de 20265 min de lecturaRead in English

Dos sitios y un solo nombre en el título

La 0.14.0 nombra todos los sitios que audita una lista de URLs. El informe de una lista con dos sitios llevaba solo el primero, como si el otro no estuviera.

La entrada de la 0.11.0, la de una lista con varios sitios, terminaba con un apartado corto sobre lo que seguía saliendo de la primera URL del fichero. Eran dos cosas: la credencial de CRAWLFORGE_AUTH, que solo se manda al host de la primera línea, y el título del informe, que llevaba su nombre. El manual lo decía en los dos idiomas y en su momento pareció suficiente.

No lo era. Una limitación apuntada en el manual sigue siendo un informe que dice algo que no es, y lo que viaja no es el manual sino el HTML.

Lo que decía el título

Esta mañana rastreé con la 0.13.0 una lista de tres líneas: dos páginas de especialmundial.com y la portada de colorvivo.com. Desde la 0.11.0 el motor trata los dos dominios como sitios auditados, así que el fichero tiene hallazgos de los dos. El informe empezaba así:

# Auditoría de https://especialmundial.com/

Modo `list` · iniciada 2026-10-12 10:18:50

Todo lo que va debajo mezcla los dos sitios: los totales, los hallazgos y las URLs de ejemplo. Un compañero que recibe el HTML lee «Auditoría de especialmundial.com» y luego se encuentra páginas de colorvivo en la lista de problemas. O piensa que la herramienta se ha liado o se pone a arreglar el sitio que no es, y ninguna de las dos cosas es buena.

La credencial y el título iban en la misma frase y no tenían que haber ido juntos. La credencial es una elección: cuando una lista mezcla sitios, decidir cuál de ellos recibe una contraseña sería adivinar, así que se queda con la primera línea a propósito. El título no se elige, es un dato del fichero (qué sitios se auditaron), y el rastreo ya tenía la respuesta.

De dónde sale la lista de sitios

El fichero de rastreo no tiene ninguna columna con los sitios. La tabla crawl_meta guarda un base_url, y en una lista ese es el de la primera línea. Pensé en añadir una columna con el conjunto entero, pero una columna nueva es una migración, y añadir una migración toca cuatro sitios del código. Además no arreglaría los ficheros que ya existen, que seguirían con el título viejo hasta que alguien volviera a rastrear.

El dato ya estaba. En un rastreo list las URLs del fichero se escriben con profundidad 0 y son las únicas filas con esa profundidad. Si una fila es interna se decide contra todas las líneas de la lista desde la 0.11.0. Así que los sitios de una lista son los hosts distintos de las filas internas de profundidad 0, en el orden en que se escribieron, que es el del fichero. Es una consulta que puede responder cualquier versión del fichero.

El fichero que había rastreado por la mañana con la 0.13.0, abierto con el binario nuevo, sale así:

# Auditoría de 2 sitios: especialmundial.com, colorvivo.com

No hizo falta volver a rastrearlo. Las listas rastreadas con la 0.11.0 o después reciben el título nuevo. Una lista de antes de la 0.11.0 es otro caso, porque entonces los demás dominios se marcaban como externos y no se auditaban, así que la consulta encuentra un sitio y el título se queda como estaba. Para ese fichero, ese título era el correcto.

Una lista con trescientos dominios

Una lista puede llevar muchos sitios, y nadie lee hasta el final un título con trescientos nombres. Se nombran tres como mucho y se cuenta el resto:

# Auditoría de 5 sitios: s1.example, s2.example, s3.example y 2 más

El número lleva el separador de millares de cada idioma, como en el resto de la herramienta.

Luego están los puertos. Desde la 0.10.0 el motor trata ejemplo.es y ejemplo.es:8443 como dos sitios distintos, porque un servidor de pruebas en otro puerto no es el sitio de producción, y el título los cuenta igual. https://ejemplo.es:443 es el mismo sitio que https://ejemplo.es con el puerto escrito, así que cuenta una vez. Los dos casos tienen su test, porque un título que no coincidiera con el motor en cuántos sitios hay sería otra forma de equivocarse.

El panel de cartera tenía el mismo problema

crawlforge portfolio junta varios ficheros de rastreo en una tabla, con una fila por fichero, y cada fila llevaba su base_url. Una lista que mezclaba sitios aparecía con el primero. Ahora la fila usa la misma lista que el título:

URLs  index.  crit  high   med   low  info  rastreado   sitio
 131       2     0     1     1     1     0  2026-10-12  especialmundial.com, colorvivo.com  (modo lista)

Hay una cosa que se queda como estaba y prefiero contarla aquí antes de que alguien se la encuentre. La cabecera del panel sigue diciendo «1 sitio», porque cuenta ficheros, y el tope de sitios de los planes también cuenta ficheros. Si una lista con cincuenta dominios es un sitio o son cincuenta es una pregunta de producto, no un fallo en un título, y no debería cambiar de rebote con este arreglo.

Los tests

Hay cinco tests nuevos. Cuatro comprueban títulos (dos sitios, cinco, dos puertos en el mismo host y la fila del panel) y el quinto comprueba que una lista de un solo sitio, escrito una vez sin puerto y otra con :443, conserva el título de siempre.

Con la función que lee los sitios desactivada, los cuatro primeros se pusieron en rojo. El quinto siguió en verde, y es lo esperado, porque protege del error contrario: contar un sitio dos veces. Así que probé ese error a propósito. Quité la línea que se salta los sitios que ya están en la lista, y el test de un solo sitio falló junto con el de dos.

La consulta solo coge filas internas de profundidad 0, y esa condición la comprobé igual. Al quitar is_internal de la consulta, el test de dos sitios se puso en rojo, porque deja una fila externa con profundidad 0. El comentario que le había puesto decía que esa fila era el destino de una redirección externa. Cuando fui al motor a confirmarlo resultó que las externas se escriben sin profundidad. La condición protege la consulta de un caso que hoy no se da, y el comentario ahora lo dice así.

Esta versión no toca ni el motor ni las reglas, solo la línea de comandos. La prueba de rendimiento de antes de publicar dio 67.457 elementos por segundo y verificar.sh pasó entero.

Lo único que sigue saliendo de la primera línea es la credencial, y eso sí es a propósito.

Se construye en público

Cada dos semanas: mediciones, fallos y ejemplos de uso. Nada más.

← Volver a la bitácora