Как контролировать кэширование веб-страниц во всех браузерах? - PullRequest
1390 голосов
/ 08 сентября 2008

Наши исследования показали, что не все браузеры одинаково уважают директивы кеша http.

В целях безопасности мы не хотим, чтобы определенные страницы в нашем приложении кэшировались, когда-либо, веб-браузером. Это должно работать как минимум для следующих браузеров:

  • Internet Explorer 6 +
  • Firefox 1.5 +
  • Safari 3 +
  • Опера 9 +
  • Chrome

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

Ответы [ 26 ]

3 голосов
/ 19 ноября 2008

В дополнение к заголовкам рассмотрите возможность обслуживания вашей страницы через https . Многие браузеры не будут кэшировать https по умолчанию.

3 голосов
/ 06 февраля 2013
//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>
2 голосов
/ 13 февраля 2014

Для завершения BalusC -> ОТВЕТ Если вы используете Perl, вы можете использовать CGI для добавления заголовков HTTP.

Использование Perl:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

Использование apache httpd.conf

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

Примечание: Когда я пытался использовать html META, браузеры игнорировали их и кэшировали страницу.

0 голосов
/ 11 августа 2016

Мне не повезло с <head><meta> элементами. Добавление параметров, связанных с HTTP-кешем напрямую (вне HTML-документа), действительно работает для меня.

Пример кода на Python с использованием вызовов web.py web.header приведен ниже. Я намеренно отредактировал свой личный ненужный служебный код.


    import web
    import sys
    import PERSONAL-UTILITIES

    myname = "main.py"

    urls = (
        '/', 'main_class'
    )

    main = web.application(urls, globals())

    render = web.template.render("templates/", base="layout", cache=False)

    class main_class(object):
        def GET(self):
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.main_form()

        def POST(self):
            msg = "POSTed:"
            form = web.input(function = None)
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.index_laid_out(greeting = msg + form.function)

    if __name__ == "__main__":
        nargs = len(sys.argv)
        # Ensure that there are enough arguments after python program name
        if nargs != 2:
            LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs)
        # Make sure that the TCP port number is numeric
        try:
            tcp_port = int(sys.argv[1])
        except Exception as e:
            LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1])
        # All is well!
        JUST-LOG("%s: Running on port %d", myname, tcp_port)
        web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port))
        main.run()

0 голосов
/ 03 июля 2014

См. Эту ссылку на пример кеширования:

http://securityevaluators.com/knowledge/case_studies/caching/

Резюме, согласно статье, только Cache-Control: no-store работает на Chrome, Firefox и IE. IE принимает другие элементы управления, а Chrome и Firefox - нет. Ссылка - хорошее чтение с историей кеширования и документальным подтверждением концепции.

0 голосов
/ 20 мая 2014

Я просто хочу отметить, что если кто-то хочет запретить кэширование ТОЛЬКО динамического контента, добавление этих дополнительных заголовков должно производиться программно.

Я отредактировал файл конфигурации моего проекта, добавив заголовки без кэширования, но это также отключило кэширование статического содержимого, что обычно нежелательно. Изменение заголовков ответов в коде гарантирует, что изображения и файлы стилей будут кэшироваться.

Это совершенно очевидно, но все же стоит упомянуть.

И еще одно предупреждение. Будьте осторожны, используя метод ClearHeaders из класса HttpResponse. Это может привести к ушибам, если вы будете использовать это безрассудно. Как будто это дало мне.

После перенаправления на событие ActionFilterAttribute последствия очистки всех заголовков теряют все данные сеанса и данные в хранилище TempData. Во время перенаправления безопаснее перенаправлять из действия или не очищать заголовки.

Если подумать, я не рекомендую всем использовать метод ClearHeaders. Заголовки лучше убирать отдельно. И чтобы правильно установить заголовок Cache-Control, я использую этот код:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...