Перезагрузите сайт, когда он достигнут через кнопку браузера Назад

Проблема: у меня есть сайт с динамическим контентом, который нужно перезагружать каждый раз, когда пользователь видит его. Это включает случай использования, когда пользователь нажимает кнопку "Назад" на другом сайте и приходит на сайт, необходимый для перезагрузки. Большинство (всех?) Браузеров не обновляют сайт после этого события.

Мое решение (которое не совсем работает): http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript

window.onbeforeunload = function () {
    // This function does nothing.  It won't spawn a confirmation dialog
    // But it will ensure that the page is not cached by the browser.
}

Но он еще не обновляет страницу.

Любые идеи, которые могут повлиять на/заблокировать желаемое поведение? Соответственно, любые другие решения для этой проблемы?

изменить:

Установить следующее:

Cache-Control   private, must-revalidate, max-age=0
Expires Sat, 26 Jul 1997 05:00:00 GMT
Pragma  no-cache

и

<meta name="cache-control" content="no-cache" />
<meta name="expires" content="0" />
<meta name="pragma" content="no-cache" />

до сих пор нет успеха.

Ответ 1

Вы должны использовать скрытый input как индикатор обновления со значением "нет":

<input type="hidden" id="refresh" value="no">

Теперь, используя jQuery, вы можете проверить его значение:

$(document).ready(function(e) {
    var $input = $('#refresh');

    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});

Когда вы нажимаете кнопку "Назад", значения в скрытых полях сохраняют то же значение, что и при первоначальном выходе из страницы.

Итак, при первом загрузке страницы входное значение будет "no". Когда вы вернетесь на страницу, это будет "да", и ваш код JavaScript вызовет обновление.

Ответ 2

После тестирования различных решений я обнаружил, что JavaScript Timing API работает лучше всего для обнаружения взаимодействий с кнопкой "Назад".

Все, что вам нужно сделать, это следующее:

if(!!window.performance && window.performance.navigation.type == 2)
{
    window.location.reload();
}

И он хорошо работает со всеми основными браузерами: http://caniuse.com/#search=Navigation%20Timing%20API

Загружается ли моя страница из кэша браузера?

Ответ 3

это работало для меня, в drupal 7 (php), когда пользователь выходит из системы, он может нажать кнопку "Назад" и сможет посещать привилегированные страницы. Если страница обновлена, он направляется на первую страницу, где он ничего не может сделать.

    <?php 
        //refresh the page after log-out and back button
        if (!user_is_logged_in())
        {

          print '<input type="hidden" id="refreshed" value="no">
                 <script type="text/javascript">
                  onload=function(){

                    var e=document.getElementById("refreshed");
                    if(e.value=="no")e.value="yes";
                    else{e.value="no";location.reload();}
                  }
                </script>';
        }
  ?>

кто-то отправил здесь: спасибо, надеюсь, он тоже вам поможет.

Ответ 4

Попробуйте следующее:

header("Cache-Control: no-store, must-revalidate, max-age=0");
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

//Дата в прошлом

Ответ 5

Помогает ли это?

Обновить страницу при нажатии кнопки

Или с метатегами,

<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache -->
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' -->
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any -->

Не уверен, что мета поможет, но вы можете проверить его.

Ответ 6

Я думаю, вам нужно точно перезагрузить - window.location.reload(). Но главная проблема - кросс-браузерное простое решение. Код на PHP:

$inline_javascript = 'var uniqueString = ' . time() . ';' .
                     'if (uniqueString === window.name) {' .
                     '  window.location.relace();' .
                     '} else {' .
                     '  window.name = uniqueString;' .
                     '}';

И напечатайте его перед css и js файлами в.

Ответ 7

Я нашел решение: добавьте no-store в заголовок Cache-Control. Я сделал это в заголовках http, но, я думаю, он мог бы работать и с метатегами. Протестировано в Chromium и Firefox.

См. также Как остановить хром от кеширования

Ответ 8

Вы можете использовать этот код в настраиваемом модуле:

<?php 
/**
 * Implements hook_init().
 */
function MY_MODULE_init() {
  drupal_add_http_header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate, post-check=0, pre-check=0');
}
?>

Ответ 9

Я думаю, этот вопрос поможет вам.

[edit (Nickolay): вот почему он работает именно так: webkit.org, developer.mozilla.org. Прочтите эти статьи (или мое резюме в отдельный ответ ниже) и подумайте, действительно ли вам нужно это делать и сделать вашу страницу медленнее для ваших пользователей.]

Ответ Nickolay