Saltar al contenido principal
riqo.ioHerramientas para grandes ideas

Normalización URI, reserved/unreserved y equivalencia

Cuándo dos URI pueden considerarse equivalentes y por qué canonicalization y percent-encoding requieren contexto.

Concepto y contexto

Normalizar un URI transforma su representación hacia una forma canónica sin cambiar el recurso identificado, pero la equivalencia no es puramente textual.

Algunas transformaciones son seguras por sintaxis y otras dependen del esquema, servidor y semántica de la aplicación.

Un buen modelo mental separa el concepto abstracto de su representación concreta y del entorno donde se utiliza. Esa separación evita trasladar automáticamente supuestos válidos en un protocolo, biblioteca o formato hacia sistemas que pueden aplicar reglas o garantías diferentes.

Fundamentos y terminología

Los caracteres unreserved pueden aparecer literalmente y los dígitos hexadecimales del percent-encoding no distinguen mayúsculas.

Los reserved pueden delimitar componentes, por lo que decodificarlos indiscriminadamente puede alterar path, query o fragment.

La terminología debe leerse junto con el estándar, versión o contrato que la define, porque palabras parecidas pueden describir propiedades distintas según la capa. Explicitar esas definiciones mejora interoperabilidad, documentación y capacidad para diagnosticar comportamientos inesperados.

Cómo funciona

Pasos comunes incluyen poner scheme y host en minúsculas, eliminar puertos por defecto y normalizar ciertos octetos codificados.

La eliminación de dot-segments está definida por URI, mientras el orden de query y slash final pueden seguir siendo significativos.

En sistemas reales conviene seguir el recorrido de los datos entre capas e identificar qué transformaciones son reversibles, cuáles introducen restricciones y dónde puede perderse información. Así resulta más sencillo razonar sobre responsabilidades entre productores, consumidores, almacenamiento y transporte.

Ejemplo razonado

https://EXAMPLE.com:443/a/../b puede equivaler a una forma más corta según el protocolo, pero /items y /items/ pueden ser rutas distintas.

Reordenar parámetros también puede invalidar firmas o cambiar aplicaciones que preservan el orden.

Un ejemplo razonado es reutilizable cuando muestra sus precondiciones e invariantes y no solo el resultado final. Cambiar un supuesto cada vez permite distinguir el comportamiento garantizado por un estándar de las decisiones particulares de una aplicación o implementación.

Errores y conceptos equivocados

Una canonicalización agresiva antes de validar puede crear discrepancias entre proxy, caché y backend.

Convertir toda la URL a minúsculas o decodificarla por completo también es erróneo porque path y query pueden ser case-sensitive y contener delimitadores codificados.

Muchos fallos nacen de supuestos implícitos entre sistemas aparentemente compatibles que usan versiones, reglas de canonicalización o modelos de tipos diferentes. En interoperabilidad y seguridad conviene especificar y probar entradas anómalas en lugar de tratarlas como casos irrelevantes.

Buenas prácticas y criterios de elección

Aplica solo transformaciones definidas por protocolo y contrato, y usa después una forma canónica consistente para comparar, firmar y cachear.

Conserva el original para auditoría cuando sea útil y prueba puertos, dot-segments, octetos codificados, Unicode y slash final.

Una práctica robusta combina estándares documentados, bibliotecas maduras, contratos explícitos y pruebas con casos límite representativos. La mejor elección no es siempre la más breve o popular: también cuentan portabilidad, legibilidad, rendimiento, seguridad, evolución y coste operativo.

Guías relacionadas

Query string y application/x-www-form-urlencoded

Estructura de query strings, pares nombre-valor, percent-encoding y reglas específicas de los formularios HTML.

URL, URI y percent-encoding

Cómo se estructuran URI y URL, qué caracteres tienen función sintáctica y cuándo interviene el percent-encoding.