Acerca de este problema HTML
Las URLs utilizadas en atributos HTML deben seguir el URL Living Standard, que define un conjunto específico de caracteres permitidos en cada parte de una URL. El componente de consulta de una URL —todo lo que viene después del ?— permite la mayoría de los caracteres ASCII imprimibles, pero ciertos caracteres aún se consideran ilegales y deben estar codificados por porcentaje. Cuando el validador W3C encuentra uno de estos caracteres prohibidos en el href de un elemento <link>, genera este error.
Los caracteres comunes que desencadenan este problema incluyen:
| Carácter | Codificado por porcentaje |
|---|
| | (pipe) | %7C |
| [ (corchete izquierdo) | %5B |
| ] (corchete derecho) | %5D |
| { (llave izquierda) | %7B |
| } (llave derecha) | %7D |
| ^ (caret) | %5E |
| ` (acento grave) | %60 |
| (espacio) | %20 |
Por qué esto importa
Aunque muchos navegadores modernos son permisivos y corregirán silenciosamente las URLs mal formadas, depender de este comportamiento es arriesgado. Las URLs inválidas pueden causar problemas de varias maneras:
- Comportamiento inconsistente del navegador: No todos los agentes de usuario manejan los caracteres ilegales de la misma manera, lo que puede llevar a hojas de estilo rotas o recursos que no cargan.
- Problemas de interoperabilidad: Los proxies, CDNs y otros intermediarios pueden rechazar o alterar URLs con caracteres ilegales.
-
Cumplimiento de estándares: El HTML válido requiere URLs válidas en los atributos. Un carácter ilegal en el
hrefhace que todo el documento no sea conforme. - Confiabilidad de copiado y compartido: Las URLs mal formadas tienen más probabilidades de romperse cuando se comparten entre sistemas, correos electrónicos o documentación.
Cómo solucionarlo
Identifica los caracteres ilegales en la cadena de consulta de tu URL y reemplaza cada uno con su equivalente codificado por porcentaje. Si estás generando URLs programáticamente, usa una función de codificación de URL adecuada (por ejemplo, encodeURIComponent() en JavaScript, urlencode() en PHP, o urllib.parse.quote() en Python) para asegurar que todos los caracteres especiales estén codificados correctamente.
Ejemplos
❌ Carácter pipe ilegal en la cadena de consulta
Este es un patrón común visto con URLs de Google Fonts que usan | para separar familias de fuentes:
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans|Roboto">
✅ Carácter pipe codificado por porcentaje
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans%7CRoboto">
❌ Corchetes en la cadena de consulta
Algunas APIs o frameworks usan notación de corchetes en parámetros de consulta:
<link rel="stylesheet" href="https://example.com/styles?themes[]=dark&themes[]=compact">
✅ Corchetes codificados por porcentaje
<link rel="stylesheet" href="https://example.com/styles?themes%5B%5D=dark&themes%5B%5D=compact">
❌ Carácter de espacio en la cadena de consulta
<link rel="stylesheet" href="https://example.com/css?file=my styles.css">
✅ Carácter de espacio codificado por porcentaje
<link rel="stylesheet" href="https://example.com/css?file=my%20styles.css">
Ten en cuenta que para Google Fonts específicamente, la API moderna (v2) usa un formato de URL diferente que evita completamente el carácter pipe. Cuando sea posible, considera actualizar a la última versión de una API en lugar de simplemente codificar la URL antigua.
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.