Command Palette

Search for a command to run...

Objeto Location: Accede y Manipula la URL Actual

Aprende a usar las propiedades del objeto location para leer y modificar la URL del navegador, incluyendo href, protocol, hostname y más.

Lectura: 10 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • El objeto location representa la URL actual del documento y permite leer y modificarla
  • location.href devuelve la URL completa y puede usarse para navegar a una nueva página
  • location.protocol indica el protocolo (http, https, file, etc.)
  • location.hostname devuelve el dominio sin el protocolo ni el puerto
  • Modificar location.href, location.assign() o location.replace() navega a una nueva URL

Introducción al Objeto Location

El objeto location es una parte fundamental del Browser Object Model (BOM) que proporciona información sobre la URL actual de la página y permite manipularla. Es una propiedad del objeto window, aunque también puede accederse directamente como location sin el prefijo window. Este objeto es esencial para tareas como redirecciones, lectura de parámetros de URL, navegación programática y detección del entorno (HTTP vs HTTPS, localhost vs producción).

El objeto location es en realidad una interfaz que hereda de URL, lo que significa que comparte muchas de las mismas propiedades y métodos. Sin embargo, location tiene la capacidad especial de modificar la URL del navegador cuando asignas valores a sus propiedades, lo que desencadena una navegación. Esta dualidad (lectura de información + capacidad de navegación) lo hace una herramienta poderosa pero también requiere cuidado para evitar redirecciones accidentales.

Propiedades del Objeto Location

El objeto location tiene múltiples propiedades que representan diferentes partes de la URL. Entender cada una de estas propiedades te permite acceder a información específica de la URL actual y manipularla de manera controlada. Para una URL como `https://example.com:8080/path/to/page?param=value#section`, cada propiedad representa una parte diferente.

  • <strong>href:</strong> La URL completa (https://example.com:8080/path/to/page?param=value#section)
  • <strong>protocol:</strong> El protocolo incluyendo los dos puntos (https:)
  • <strong>hostname:</strong> El dominio sin puerto (example.com)
  • <strong>host:</strong> El dominio con puerto (example.com:8080)
  • <strong>port:</strong> El número de puerto (8080)
  • <strong>pathname:</strong> La ruta después del dominio (/path/to/page)
  • <strong>search:</strong> Los parámetros de query string (?param=value)
  • <strong>hash:</strong> El identificador de fragmento (#section)
  • <strong>origin:</strong> El origen (protocolo + hostname + puerto)

Diferencia entre hostname y host

hostname devuelve solo el dominio (ej: example.com), mientras que host incluye el puerto si es diferente del puerto predeterminado del protocolo (ej: example.com:8080). Para la mayoría de los casos de uso, hostname es lo que necesitas, pero host es útil cuando trabajas con puertos personalizados en desarrollo o servidores no estándar.

location.href

location.href es probablemente la propiedad más usada del objeto location porque devuelve la URL completa de la página actual. Además de leer la URL, puedes asignar un nuevo valor a location.href para navegar a una página diferente. Esto es funcionalmente equivalente a hacer clic en un enlace, pero programáticamente desde JavaScript.

Leer location.href

Este ejemplo muestra cómo leer la URL completa usando location.href.

leer-href.js
Loading code...

location.href devuelve la URL completa como una cadena de texto. Esto es útil para logging, debugging, o cuando necesitas pasar la URL actual a una API o función. La propiedad es de lectura y escritura, lo que significa que también puedes asignarle un nuevo valor para navegar a una página diferente.

protocol y hostname

Las propiedades protocol y hostname son útiles para detectar el entorno de la aplicación y construir URLs relativas al dominio. protocol te permite saber si la página se está sirviendo a través de HTTP o HTTPS, lo cual es importante para seguridad y para determinar si puedes usar ciertas APIs. hostname te da el dominio, lo que es útil para construir URLs absolutas o para lógica que depende del dominio.

Detectar HTTPS

Este ejemplo muestra cómo detectar si la página se está sirviendo a través de HTTPS.

detectar-https.js
Loading code...

Detectar HTTPS es importante porque algunas APIs y características solo funcionan en contextos seguros (HTTPS). Por ejemplo, la API de Geolocalización, Service Workers, y algunas APIs de almacenamiento requieren HTTPS. Este patrón te permite mostrar mensajes informativos o degradar funcionalidad cuando no estás en un contexto seguro.

Mejor práctica: Contextos seguros

Muchas APIs modernas del navegador solo funcionan en contextos seguros (HTTPS o localhost). Siempre verifica location.protocol antes de usar APIs sensibles como Geolocalización, Notifications, o Service Workers. En desarrollo, localhost se considera un contexto seguro, pero en producción necesitas HTTPS.

Leer hostname

Este ejemplo muestra cómo usar hostname para obtener el dominio de la página actual.

leer-hostname.js
Loading code...

hostname devuelve el dominio sin el protocolo ni el puerto. Esto es útil para construir URLs relativas al dominio, para lógica que depende del dominio (como configuraciones específicas por entorno), o para mostrar información al usuario sobre dónde está hospedada la aplicación. A diferencia de host, hostname nunca incluye el puerto.

Construir URLs Absolutas

Este ejemplo muestra cómo construir URLs absolutas usando protocol y hostname.

construir-url.js
Loading code...

Construir URLs absolutas usando protocol y hostname es útil cuando necesitas hacer solicitudes a APIs en el mismo dominio, pero quieres asegurarte de que la URL sea absoluta y no relativa. Esto es especialmente importante en entornos donde la base URL puede cambiar (desarrollo vs producción) o cuando estás construyendo URLs para enlaces en correos electrónicos o notificaciones.

pathname, search y hash

Las propiedades pathname, search y hash representan las partes de la URL después del dominio. pathname es la ruta de la página, search contiene los parámetros de query string, y hash es el identificador de fragmento (lo que va después del #). Estas propiedades son esenciales para leer parámetros de URL, implementar navegación basada en hash, y construir rutas dinámicas.

Leer pathname

Este ejemplo muestra cómo leer el pathname de la URL actual.

leer-pathname.js
Loading code...

pathname devuelve la ruta de la página sin el dominio, protocolo, parámetros de query o hash. Esto es útil para routing en aplicaciones SPA, para determinar qué página o vista mostrar, o para lógica que depende de la ruta actual. A diferencia de window.location.pathname, esta propiedad no incluye el dominio ni los parámetros de query string.

Leer hash

Este ejemplo muestra cómo leer y escuchar cambios en el hash de la URL.

leer-hash.js
Loading code...

hash devuelve el identificador de fragmento incluyendo el signo de almohadilla (#section). El hash se usa comúnmente para navegación dentro de una página (enlaces ancla) o para implementar routing basado en hash en aplicaciones SPA. El evento hashchange se dispara cuando el hash cambia, lo que te permite responder a cambios en la URL sin recargar la página.

Routing basado en hash

Antes de que la History API fuera ampliamente soportada, muchas SPAs usaban routing basado en hash (ej: example.com/#/home, example.com/#/about). Aunque hoy en día history.pushState es preferido, el routing basado en hash sigue siendo útil para aplicaciones que necesitan soportar navegadores antiguos o para casos donde no puedes configurar el servidor para manejar rutas.

Modificar la URL

Además de leer las propiedades de location, puedes modificarlas para cambiar la URL del navegador. Sin embargo, hay diferentes métodos para hacerlo con diferentes efectos en el historial del navegador. Es importante entender las diferencias entre location.href, location.assign(), location.replace(), y modificar propiedades individuales.

Asignar location.href

Este ejemplo muestra cómo navegar asignando un valor a location.href.

asignar-href.js
Loading code...

Asignar un valor a location.href es la forma más común de navegar a una nueva página. Esto crea una nueva entrada en el historial del navegador, por lo que el usuario puede usar el botón "atrás" para volver a la página anterior. Es funcionalmente equivalente a location.assign(), pero la sintaxis de asignación es más concisa.

location.replace()

Este ejemplo muestra cómo usar location.replace() para navegar sin crear entrada en el historial.

location-replace.js
Loading code...

location.replace() navega a una nueva URL pero reemplaza la entrada actual del historial en lugar de crear una nueva. Esto significa que el usuario no puede usar el botón "atrás" para volver a la página anterior. Esto es útil para redirecciones después de un login, después de enviar un formulario, o cuando no quieres que el usuario pueda volver a una página específica.

Advertencia: No se puede deshacer

location.replace() es destructivo porque elimina la entrada actual del historial. Úsalo solo cuando estés seguro de que el usuario no necesita volver a la página anterior. Para navegación normal, usa location.href o location.assign() que preservan el historial.

Modificar solo el hash

Este ejemplo muestra cómo modificar solo el hash de la URL sin recargar la página.

modificar-hash.js
Loading code...

Modificar location.hash solo cambia el identificador de fragmento sin recargar la página y sin crear una nueva entrada en el historial. Esto es útil para navegación dentro de una página (scroll a secciones específicas) o para implementar routing basado en hash. El cambio en el hash también dispara el evento hashchange, que puedes escuchar para responder a cambios en la URL.

Errores Comunes

Al trabajar con el objeto location, hay varios errores que los desarrolladores cometen frecuentemente. Conocer estos patrones problemáticos te ayudará a evitarlos y escribir código más robusto.

Error: Modificar protocol directamente

Un error común es intentar modificar location.protocol directamente, lo que puede causar comportamientos inesperados o errores de seguridad.

error-modificar-protocol.js
Loading code...

Modificar location.protocol directamente puede causar que la página se recargue con el nuevo protocolo, lo que puede resultar en una página en blanco si el servidor no soporta el protocolo solicitado. Además, cambiar de HTTPS a HTTP puede bloquearse por el navegador por razones de seguridad. La forma correcta es usar location.href o location.replace() con la URL completa.

solucion-modificar-protocol.js
Loading code...

La solución es construir la URL completa con el nuevo protocolo y usar location.href o location.replace() para navegar. Esto da control total sobre la navegación y evita comportamientos inesperados.

Error: No verificar HTTPS antes de usar APIs

Otro error común es usar APIs que requieren HTTPS sin verificar primero el protocolo, lo que causa errores en entornos HTTP.

error-no-verificar-https.js
Loading code...

Este código intenta usar la API de Geolocalización sin verificar si está en un contexto seguro. En HTTP, esto causará un error porque la API de Geolocalización solo funciona en HTTPS o localhost. El usuario verá un error en la consola y la funcionalidad no funcionará.

solucion-verificar-https.js
Loading code...

La solución verifica location.protocol antes de usar la API y proporciona una alternativa o mensaje informativo cuando no está en un contexto seguro. Esto mejora la experiencia del usuario y evita errores silenciosos.

Resumen: Objeto Location

Conceptos principales:

  • El objeto location representa la URL actual y permite leer y modificarla
  • location.href devuelve la URL completa y puede usarse para navegar
  • location.protocol indica el protocolo (http:, https:, file:)
  • location.hostname devuelve el dominio sin protocolo ni puerto
  • pathname, search y hash representan las partes de la URL después del dominio

Mejores prácticas:

  • Usa location.href o location.assign() para navegación normal con historial
  • Usa location.replace() cuando no quieras que el usuario pueda volver atrás
  • Verifica location.protocol antes de usar APIs que requieren HTTPS
  • Usa URLSearchParams para parsear query strings de manera fácil
  • Usa location.hash para navegación dentro de la página sin recargar