Как работает кнопка "Назад" в веб-браузере?

84

Я искал в Интернете этот вопрос, но ничего не нашел:

Какая логика кнопки назад? Что происходит, когда мы нажимаем кнопку «Назад» в веб-браузере?

Я действительно хотел бы больше узнать об этом.

Спасибо.

Пьер Тибо
источник
14
Отправляет ли он запрос повторно или загружает страницу из локального кеша? Отправляются ли файлы cookie, созданные в первом ответе, при ответном ответе? и т. д.
Джимми

Ответы:

100

Ваш веб-браузер хранит стек (или список, если хотите) веб-страниц, которые вы посетили в этом окне. Допустим, ваша домашняя страница - google.com, а оттуда вы посещаете еще несколько веб-сайтов: youtube.com, yahoo.com и cnn.com. При посещении последней список выглядит так:

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

Когда вы нажимаете кнопку «Назад», браузер возвращает вас на предыдущую страницу в списке, например:

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

На этом этапе вы можете снова нажать «Назад», чтобы перейти на youtube.com, или нажать «Вперед», чтобы снова перейти на cnn.com. Допустим, вы нажимаете Back во второй раз:

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

Если вы теперь перейдете, скажем, на abc.com, список изменится и будет выглядеть следующим образом:

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

Обратите внимание, что yahoo.com и cnn.com исчезли из списка. Это потому, что вы выбрали новый маршрут. Браузер поддерживает только список страниц, которые вы посетили, чтобы попасть туда, где вы сейчас находитесь, а не историю каждой страницы, на которой вы когда-либо были. Браузер также ничего не знает о структуре посещаемого вами сайта, что может привести к неожиданному поведению.

Вы находитесь на сайте покупок (например, ne.com), на котором есть категории и подкатегории продуктов для просмотра. Дизайнер сайта вдумчиво предоставил хлебные крошки в верхней части окна, чтобы вы могли перемещаться по категориям. Вы начинаете с верхней страницы сайта, нажимаете «Оборудование», затем «Память». Список теперь выглядит так:

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

Вы хотите вернуться в категорию «Оборудование», поэтому вместо кнопки «Назад» используйте навигационные цепочки для перехода к родительской категории. Теперь список браузеров выглядит так:

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

Согласно структуре сайта вы пошли назад (на уровень выше), но в браузере вы пошли вперед, потому что вы перешли по ссылке. Каждый раз, когда вы нажимаете ссылку или вводите URL-адрес в адресной строке, вы продвигаетесь вперед в том, что касается браузера, независимо от того, ведет ли эта ссылка на страницу, на которой вы уже были.

Наконец, вы хотите вернуться на главную страницу сайта (ne.com). Вы можете использовать панировочные сухари, но на этот раз вы нажмете кнопку «Назад» - кажется очевидным, что это должно поднять вас на один уровень, верно? Но куда это вас приведет?

Изначально многих пользователей (включая меня, когда я делаю именно это) сбивает с толку, что вы «спускаетесь» на уровень ниже, обратно в категорию памяти. Глядя на список страниц, легко понять, почему:

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

Чтобы вернуться на главную страницу, используя только кнопку «Назад», потребуется еще два нажатия, которые вернут вас «назад» в категорию «Оборудование» и, наконец, на главную страницу. Нам, программистам, кажется настолько очевидным, что происходит, но это постоянно удивляет обычных пользователей, потому что они не понимают, что браузер ничего не знает об иерархической структуре любого веб-сайта, на котором они оказались.

Было бы здорово, если бы браузеры позволяли дизайнерам сайтов программировать кнопку «Назад» так, чтобы она делала очевидную вещь (поднимала вас на уровень выше), а не то, что она делает сейчас?

Изменить: комментатор спросил, перезагружает ли браузер страницу или просто отображает ее из локального кеша.

Ответ в зависимости от обстоятельств. Дизайнеры сайта могут указать, должен ли браузер кэшировать страницу или нет. Для страниц, которые настроены как некэшированные, браузер перезагружает страницу с сервера при нажатии кнопки «Назад», как если бы вы посещали ее впервые. Для кешированных страниц браузер отображает их из кеша, что намного быстрее.

Барри Браун
источник
5
Когда браузер просматривает кеш, проверяет ли он дату истечения срока действия в заголовке ответа сервера? Я предполагаю, что если срок действия страницы истек, браузер отправит тот же запрос, не так ли? Аналогично ли обрабатываются получение и публикация кнопки возврата? Спасибо за отличный ответ.
Пьер Тибо,
5
Первый вопрос: да, правильно. Если срок действия страницы истек, браузер должен повторно запросить страницу, используя тот же URL-адрес и данные POST. Но для операций POST большинство браузеров спрашивают пользователя, хотят ли они повторно отправить его. Я предполагаю, что повторная отправка данных POST может потенциально привести к дублированию публикаций, дублированию транзакций и т. Д. Дизайнер сайта должен предотвратить это.
Барри Браун
Да, но в случае POST, я думаю, браузер будет запрашивать только в случае POST, срок действия которого истек. Я прав? Потому что, когда я занимался разработкой с помощью ASP.net, кнопка «Назад» снова отправляла на сервер без запроса.
Пьер Тибо,
Наверное, зависит от браузера. Мой браузер (Safari) всегда спрашивает - по крайней мере, я думаю, он всегда спрашивает.
Барри Браун,
Я использовал Safari. Не всегда спрашивают. Это должно следовать описанной мной логике.
Пьер Тибо,
5

Мне нравится думать об этом как о повторной выдаче моего последнего запроса. Если вы выполнили простой GET, он, вероятно, вернет то же самое, что и в прошлый раз (за вычетом динамического содержимого). Если вы выполнили POST, вы собираетесь повторно отправить форму (после подтверждения) на сервер.

Джон Ховен
источник
2

Основная идея - вернуться к последней странице или логическому разделу сайта.

Посмотрев на Gmail, вы увидите, если вы выполните поиск и щелкните сообщение, а затем нажмите кнопку «Назад», это вернет вас к выполненному вами поиску.

Когда вы щелкаете по нему в большинстве браузеров, он либо повторно отправит последний HTTP-запрос, либо загрузит кеш, если браузер кэширует сайты.

BobBrez
источник
Когда браузер использует кеш и когда повторно отправляет запрос?
Пьер Тибо,
Это зависит от браузера и того, что было сделано до этого момента. Вы можете настроить большинство браузеров не кешировать, чтобы они всегда перезагружались. Существует метатег HTML для кеширования, но его соблюдение остается за браузером.
BobBrez
2

Я думаю, что самый простой способ объяснить это - псевдокод:

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)
Имажинист
источник
1

История просмотренных страниц хранится в виде стека. Когда вы «открываете» три верхние страницы (например, A, B, C), а затем переходите на другую страницу D, вы не можете снова попасть на B, нажав вперед.

Каяко
источник
0

Как уполномоченный, вы должны убедиться, что ваше веб-приложение работает независимо от того, как браузер обрабатывает кнопку «Назад» :-) Отправляет ли он запрос повторно? Новый запрос идентичен старому или чем-то отличается? Будет ли браузер запрашивать у пользователя подтверждение повторной POST? Какие элементы страницы будут запрашиваться повторно, а какие загружаться из кеша? Будет ли браузер учитывать мои заголовки управления кешем?

Ответы на эти вопросы зависят от производителя, версии браузера и пользовательских настроек. Создавайте программное обеспечение так, чтобы все это не имело большого значения.

Извините за не очень прямой ответ, но здесь уже есть несколько прямых ответов.

Илья Бирман
источник
Увы, учитывая все возможные эффекты кнопки «Назад», это сводит с ума большинство разработчиков, в том числе и меня.
Луиза,
0

браузер всегда сохранял страницы для запоминания, и когда мы нажимаем кнопку возврата, он не отправляет запрос на сервер для предыдущей страницы, вместо этого он просто видит свой кеш, в котором он хранил страницы, и он следует правилу LIFO, поэтому он дайте нам эту страницу первой, нажав кнопку "Назад", которую мы открыли в последнем

Дилип Кумар
источник
2
Нет, пусть это не работает! Если кеш больше не действителен, он отправляет запрос на сервер, чтобы получить страницу снова.
Пьер Тибо,
-1

Браузер загружает последнюю просмотренную страницу перед текущей, а затем выполняет любое перенаправление, которое может произойти?

Мне кажется, я упускаю суть вопроса.

code_burgar
источник
Вероятно, они захотят отключить кнопку «Назад» или предотвратить ее использование. Удачи.
Джон Ховен,