Cuando «pl» significaba dos cosas distintas
El 19 de agosto de 2026 añadimos una regla a .htaccess que bloquea una clase de archivo que nunca debería servirse directamente a un navegador: copias de código fuente que quedan olvidadas en la raíz web tras una edición — index.php.bak, un config.py perdido, cualquier cosa con una extensión de script donde un visitante pudiera obtener el código fuente como texto plano en lugar de ejecutarlo.
La regla comparaba por extensión de archivo: .php, .py, .rb, .pl, y una docena más. .pl es Perl. Este proyecto no tiene ni una línea de Perl — la regla era preventiva, no una corrección para un archivo que existiera.
Aproximadamente un día después, un visitante informó de que las vistas previas de los contadores estaban rotas. Todas ellas, pero solo en un idioma.
El otro «pl»
stats4u.net elige un idioma por visitante mediante la negociación Accept-Language, no un valor fijo por defecto — un navegador configurado en polaco recibe directamente /pl/, sin redirección de por medio, y el inglés es a lo que recurre el sitio cuando nada coincide. El polaco es una coincidencia habitual: suficientes visitantes acaban ahí como para que un día de miniaturas rotas no fuera a pasar desapercibido mucho tiempo.
Cada vista previa de diseño es un pequeño archivo por estilo e idioma: cache/preview/2900.pl.svg. El patrón pensado para detectar something.pl — un script de Perl — también coincidía con 2900.pl seguido de .svg: un número de estilo, un código de idioma que resulta escribirse igual que una extensión de script, y luego el tipo de archivo real. Un patrón punto-pl-punto no puede distinguir entre los dos.
Todas las vistas previas .pl.svg y .pl.png de la galería empezaron a responder 403 Forbidden. Ningún otro idioma se vio afectado, porque ningún otro código de idioma que usa este sitio coincide con una entrada de la lista de extensiones. Solo ese.
Qué cambió
pl salió de la lista de extensiones. Sigue bloqueando toda extensión de script real que a este proyecto le convenga vigilar; ya no bloquea un idioma.
Merece la pena dejarlo por escrito, por el motivo por el que llegó a ocurrir: una lista de extensiones de archivo y una lista de códigos de idioma vienen de dos vocabularios distintos, y nada impide que una entrada de dos letras signifique ambas cosas a la vez. Antes de añadir algo a cualquiera de las dos listas en un sitio con prefijos de idioma en la ruta, hay que comprobarlo contra la otra. Nosotros no lo hicimos, y hizo falta que un lector notara las miniaturas rotas — no nuestra propia monitorización — para detectarlo.