Safari, кажется, игнорирует настройки кэша, когда пользователь нажимает кнопку мыши или клавиатуры - PullRequest
5 голосов
/ 06 августа 2010

У меня есть страница, на которой после нажатия кнопки она заменяется вращателем Ajax, пока пользователь ожидает загрузки следующей страницы.

Я контролирую (или пытаюсь контролировать) кэширование с помощью .htaccess. Если пользователь нажимает назад (кнопка браузера, кнопка мыши, alt + left, backspace), ему необходимо перезагрузить страницу из кэша. IE 6-8 и Chrome были в порядке с этим. Firefox некоторое время не работал и недавно начал работать, но проблема, похоже, остается в Safari. Это кажется немного странным, потому что я ожидал, что Safari и Chrome будут вести себя одинаково.

Это мой файл .htaccess:

# Add Proper MIME-Type for Favicon
AddType image/x-icon .ico

<IfModule mod_expires.c>
    ExpiresActive On
#   ExpiresDefault A2630000
    ExpiresByType image/x-icon A2630000
    ExpiresByType image/gif A2630000
    ExpiresByType image/jpeg A2630000
    ExpiresByType image/png A2630000
    ExpiresByType application/x-javascript M2630000
    ExpiresByType application/javascript M2630000
    ExpiresByType text/css M2630000
</IfModule>

<IfModule mod_headers.c>
    Header set Cache-Control "public"
    <FilesMatch "\.php$">
        Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0"
    </FilesMatch>
</IfModule>

SetOutputFilter DEFLATE

AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript

Я пробовал это с открытой строкой Cache-Control и без нее.

Я также пытался добавить:

AddType application/x-httpd-php .php

с:

ExpiresByType application/x-httpd-php A0

Безрезультатно.

Я что-то упускаю из виду?

Редактировать: я не думаю, что это связано с настройками кеша.

Я пытался добавить это к самому PHP:

#safari test
if (strstr($_SERVER['HTTP_USER_AGENT'],'Safari')){
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
}

И даже без этих строк я вижу в ресурсах "inspect element">, что правильные заголовки принимаются. Похоже, проблема в том, что Safari делает с ними в стремлении стать «самым быстрым браузером». Похоже, что он явно игнорирует специфику разработчиков сайта - это звучит как оригинальное мышление IE в те времена, когда таблицы использовались для макетов.

Ответы [ 5 ]

3 голосов
/ 14 августа 2010

В спецификации HTTP прямо сказано, что при вызове из истории (кнопка назад / вперед) не требуется проверка кэша.Так что это похоже на правильное поведение.

1 голос
/ 29 сентября 2012

Такое поведение вызвано обратным кешем . Вы можете нажать на событие onpageshow, чтобы узнать, когда пользователь перемещается с помощью кнопки назад. Ищите свойство под названием persisted. При начальной загрузке страницы устанавливается значение false. Однако, когда страница приходит из bfcache, она устанавливается в true.

Затем вы можете принудительно перезагрузить страницу с помощью JavaScript:

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload(true) 
    }
};

или, если вы используете jQuery:

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        window.location.reload(true) 
    }
};
0 голосов
/ 17 августа 2010

Safari дает вам 304, а Chrome нет?Если это так, я подозреваю, что вы используете Apache 2.0 и обновление до Apache 2.2 решает эту проблему.

0 голосов
/ 17 августа 2010

Попробуйте добавить это как тег meta в ваш HTML:

<meta http-equiv="cache-control" content="no-cache, no store, must-revalidate"/>
0 голосов
/ 10 августа 2010

У меня была похожая проблема с Firefox, но я изменил .htaccess с помощью кода ...

<IfModule mod_headers.c>
  Header set Cache-Control "public"
  <FilesMatch "\.php$">
      Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0"
  </FilesMatch>
</IfModule>

..., который, по иронии судьбы, у вас есть в вашем коде, исправил это для меня.Не уверен насчет проблемы Safari.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...