¿Cómo funciona el botón Atrás en un navegador web?

84

Busqué en la Web sobre esta pregunta pero no encontré nada:

¿Cuál es la lógica del botón de retroceso? ¿Qué sucede cuando presionamos el botón Atrás en un navegador web?

Realmente me gustaría entender más sobre eso.

Gracias.

Pierre Thibault
fuente
14
¿Reenvía la solicitud o carga la página desde la caché local? ¿Las cookies que se crearon en la primera respuesta se envían cuando responde? etc.
Jimmy

Respuestas:

99

Su navegador web mantiene una pila (o lista, si lo desea) de las páginas web que ha visitado en esa ventana. Digamos que su página de inicio es google.com y desde allí visita algunos otros sitios web: youtube.com, yahoo.com y cnn.com. Al visitar el último, la lista se ve así:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                            ^
                                            |
                                       current page

Cuando presiona el botón Atrás, el navegador lo lleva de regreso a la página anterior en la lista, así:

google.com -> youtube.com -> yahoo.com -> cnn.com
                                ^
                                |
                           current page

En este punto, puede presionar Atrás nuevamente para ir a youtube.com, o puede presionar Adelante para ingresar nuevamente a cnn.com. Digamos que presiona Atrás por segunda vez:

google.com -> youtube.com -> yahoo.com -> cnn.com
                   ^
                   |
              current page

Si ahora va a, digamos, abc.com, la lista cambia para verse así:

google.com -> youtube.com -> abc.com
                               ^
                               |
                          current page

Tenga en cuenta que tanto yahoo.com como cnn.com han desaparecido de la lista. Esto se debe a que tomó una nueva ruta. El navegador solo mantiene una lista de las páginas que visitó para llegar a donde se encuentra ahora, no un historial de todas las páginas en las que ha estado. El navegador tampoco sabe nada sobre la estructura del sitio que está visitando, lo que puede provocar un comportamiento sorprendente.

Estás en un sitio de compras (ne.com, como un breve ejemplo) que tiene categorías y subcategorías de productos para navegar. El diseñador del sitio ha proporcionado cuidadosamente rutas de navegación cerca de la parte superior de la ventana para permitirle navegar por las categorías. Empiece en la página superior del sitio, haga clic en Hardware y luego en Memoria. La lista ahora se ve así:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem
                                           ^
                                           |
                                      current page

Desea volver a la categoría Hardware, por lo que usa las rutas de exploración para subir a la categoría principal en lugar de usar el botón Atrás. Ahora la lista del navegador se ve así:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                                          ^
                                                          |
                                                     current page

De acuerdo con la estructura del sitio, retrocedió (subió un nivel), pero al navegador avanzó porque hizo clic en un enlace. Cada vez que hace clic en un enlace o escribe una URL en la barra de direcciones, avanza en lo que respecta al navegador, ya sea que ese enlace lo lleve o no a una página en la que ya ha estado.

Finalmente, desea volver a la página principal del sitio (ne.com). Podrías usar las migas de pan, pero esta vez haces clic en el botón Atrás; parece obvio que debería llevarte un nivel arriba, ¿verdad? Pero, ¿a dónde te lleva?

Inicialmente es confuso para muchos usuarios (incluido yo mismo, cuando por casualidad hago exactamente esto) que te lleva "hacia abajo" un nivel, de vuelta a la categoría Memoria. Al mirar la lista de páginas, es fácil ver por qué:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw
                                            ^
                                            |
                                       current page

Para volver a la página principal usando sólo el botón Atrás se necesitarían dos pulsaciones más, lo que le llevaría "de vuelta" a la categoría Hardware y finalmente a la página principal. A los programadores nos parece tan obvio lo que está pasando, pero sorprende muchísimo a los usuarios habituales todo el tiempo porque no se dan cuenta de que el navegador no sabe nada sobre la estructura jerárquica de cualquier sitio web en el que se encuentren.

¿Sería genial si los navegadores permitieran a los diseñadores de sitios programar el botón Atrás para hacer lo obvio (subir de nivel) en lugar de lo que hace ahora?

Editar: un comentarista preguntó si el navegador recarga la página o simplemente la muestra fuera de su caché local.

La respuesta es, depende. Los diseñadores de sitios pueden especificar si el navegador debe almacenar en caché la página o no. Para las páginas que están configuradas como no almacenadas en caché, el navegador vuelve a cargar la página desde el servidor cuando presiona Atrás, como si fuera la primera vez que la visita. Para las páginas almacenadas en caché, el navegador las muestra fuera de la caché, que es mucho más rápido.

Barry Brown
fuente
5
Cuando el navegador busca en la caché, ¿verifica la fecha de vencimiento en el encabezado de la respuesta del servidor? Supongo que si la página expiró, el navegador devolverá la misma consulta, ¿no? ¿Obtener y publicar se manejan de la misma manera con respecto al botón Atrás? Gracias por tu gran respuesta.
Pierre Thibault
5
Primera pregunta: sí, eso es correcto. Si la página ha caducado, el navegador debe volver a solicitar la página utilizando la misma URL y los mismos datos POST. Pero para las operaciones POST, la mayoría de los navegadores preguntan al usuario si desea reenviarlo. Supongo que volver a enviar los datos POST podría dar como resultado publicaciones duplicadas, transacciones duplicadas, etc. Depende del diseñador del sitio evitar que eso suceda.
Barry Brown
Sí, pero en caso de un POST, creo que el navegador solo preguntará en el caso de un POST que haya caducado. Estoy en lo cierto? Porque cuando estaba desarrollando con ASP.net, el botón de retroceso se estaba publicando nuevamente en el servidor sin preguntar.
Pierre Thibault
Probablemente depende del navegador. Mi navegador (Safari) siempre pregunta, al menos creo que siempre pregunta.
Barry Brown
Estaba usando Safari. No siempre pregunta. Debe seguir la lógica que describí.
Pierre Thibault
5

Me gusta pensar en ello como volver a emitir mi última solicitud. Si realizó un GET simple, probablemente devolvería lo mismo que hizo la última vez (menos contenido dinámico). Si ha realizado un POST, volverá a enviar el formulario (después de la confirmación) al servidor.

John Hoven
fuente
2

La idea básica es volver a la última página o división lógica del sitio.

Al mirar Gmail, verá si hace una búsqueda y hace clic en un mensaje, luego presiona el botón Atrás y lo llevará de regreso a la búsqueda que hizo.

Cuando haga clic en él en la mayoría de los navegadores, reenviará la última solicitud http o cargará un caché si el navegador almacena sitios en caché.

BobBrez
fuente
¿Cuándo utiliza el navegador la caché y cuándo vuelve a enviar una solicitud?
Pierre Thibault
Depende del navegador y de lo que se haya hecho hasta ese momento. Puede configurar la mayoría de los navegadores para que no almacenen en caché, por lo que siempre se recargarán. Hay una metaetiqueta HTML para el almacenamiento en caché, pero respetarla depende del navegador.
BobBrez
2

Creo que la forma más fácil de explicar esto es en pseudocódigo:

class Page:
    String url, ...
    Page previous, next # implements a doubly-linked list

class History:
    Page current # current page

    void back():
        if current.previous == null:
            return
        current = current.previous
        refresh()

    void forward():
        if current.next == null:
            return
        current = current.next
        refresh()

    void loadPage(Page newPage):
        newPage.previous = current
        current.next = newPage # remove all the future pages
        current = current.next
        display(current)
Imagist
fuente
1

Un historial de páginas vistas se mantiene en forma de pila. Cuando "abre" las tres páginas superiores (A, B, C, por ejemplo) y luego pasa a una página D diferente, no puede volver a la B presionando hacia adelante.

kajaco
fuente
0

Como desarrollador, debe asegurarse de que su aplicación web funcione sin importar cómo el navegador maneje el botón Atrás :-) ¿Reenvía la solicitud? ¿La nueva solicitud es idéntica a la anterior o difiere de alguna manera? ¿El navegador pedirá al usuario que confirme la re-POST? ¿Qué elementos de la página se volverán a solicitar y qué se cargará desde la caché? ¿Respetará el navegador mis encabezados de control de caché?

Las respuestas a estas preguntas dependen de la marca, la versión del navegador y la configuración del usuario. Diseñe su software para que todo esto no importe tanto.

Lo siento por una respuesta no muy directa, pero ya hay algunas respuestas directas aquí.

Ilya Birman
fuente
Por desgracia, teniendo en cuenta todos los posibles efectos del botón Atrás, algo que vuelve locos a la mayoría de los desarrolladores, incluido yo mismo.
Louise
0

un navegador siempre almacena las páginas para recordarlas y cuando presionamos el botón Atrás, no envía la solicitud al servidor para la página anterior, sino que solo ve su caché donde almacenó las páginas y sigue la regla LIFO, por eso danos esa página primero al presionar el botón Atrás que abrimos en la última

Dileep Kumar
fuente
2
No, no funciona ¡deja eso! Si la caché ya no es válida, envía una solicitud al servidor para obtener la página nuevamente.
Pierre Thibault
-1

¿El navegador carga la última página vista antes de la actual y luego sigue cualquier redirección que pueda ocurrir?

Parece que me estoy perdiendo el punto de la pregunta.

code_burgar
fuente
Probablemente quieran deshabilitar el botón de retroceso o evitar su uso. Buena suerte.
John Hoven