Как я могу получить контроль над поведением кэширования Google App Engine в WebKit (etags с ума сошли)? - PullRequest
23 голосов
/ 10 декабря 2010

Ситуация: запуск сайта Google App Engine с заданным по умолчанию статическим содержанием для моего содержимого default_expiration "14d"

Проблема: в Chrome и Safari, посещение URL-адреса ( не , перезагрузка, просто установка курсора в адресную строку и нажатие клавиши Enter) вызывает тонну запросов на запуск с заголовками If-None-Match. Ответы всегда 304 Не изменены, как и ожидалось. Я могу наблюдать, как эти запросы запускаются в отладочном прокси-сервере, таком как Чарльз или Фиддлер.

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

Мы используем стандартное «кешируемое статическое содержимое в течение очень долгого времени, мы позаботимся о добавлении? Version = {version} изменений в наши строки запросов, когда нам нужно разрушить кеш», так что мы действительно хотел бы избежать 304-х годов.

Вера: Я думаю, это вызвано заголовком etag, который механизм приложений отправляет при каждом ответе статического содержимого. SDK обработчика приложений не отправляет этот заголовок, и я не вижу такого поведения 304 при возни с SDK.

Есть совет? Можете ли вы отключить etags для статического содержимого ядра приложения?

Обновлен пример статического содержимого: http://www.khanacademy.org/stylesheets/shared-package/compressed.css

Ответы [ 7 ]

8 голосов
/ 01 марта 2011

Хотя я не верю, что существует какой-либо способ управления поведением заголовка etags для GAE, это , вызванное ошибкой в ​​WebKit, которая приводит к повторной загрузке всего статического содержимого при получении перенаправления 302 послеPOST-запрос .

Как только WebKit исправит эту ошибку, проблема должна исчезнуть.

Если необходимо, вы можете временно обойти эту конкретную ошибку redirect-after-POST, перенаправив черезОбновить заголовок вместо использования перенаправления 302.

https://bugs.webkit.org/show_bug.cgi?id=38690

Перезагрузка образа WebKit при публикации / перенаправлении / получении

http://www.google.com/support/forum/p/Chrome/thread?tid=72bf3773f7e66d68&hl=en

5 голосов
/ 11 декабря 2010

Вам необходимо удалить заголовки Last-Modified и ETag.

Удаляя заголовок ETag, вы отключаете кэши и браузеры от возможности проверять файлы, поэтому они вынуждены полагаться на ваш Cache-Контролирует и истекает заголовок.Теги сущностей (ETag) - это механизм проверки более новой версии кэшированного файла.

Удалив заголовки Last-Modified и ETag, вы полностью исключите If-Modified-Since и If-None-Matchзапросов и их 304 неизмененных ответов, поэтому файл будет оставаться в кэше без проверки обновлений до тех пор, пока заголовок Expires не покажет, что новое содержимое доступно.не знаю, как можно отключить их для статического содержимого GAE.

3 голосов
/ 10 февраля 2011

Ваше значение ETag в порядке.ETag не форсирует повторную проверку.Это только позволяет ему быть более надежным, чем дата последнего изменения.Я только что просмотрел ваш пример статического контента с использованием Chrome 9, и ваш контент кэшируется и не проходит ненужную повторную проверку.Проблема, которую вы видели, может быть связана с «всегда повторной проверкой» настроек браузера, которые не являются настройками по умолчанию для большинства браузеров.Это также может быть ошибка, связанная с веб-набором Mac.

3 голосов
/ 10 декабря 2010

Так как это проблема с Chrome и Safari, вы можете использовать Кэш приложения HTML5 , чтобы полностью запретить обращения сервера к статическим ресурсам. Посмотрите пример здесь .

3 голосов
/ 10 декабря 2010

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

Кроме того, проверьте эти инструкции Google, они мне очень помогли при настройке параметров кэширования: http://code.google.com/speed/page-speed/docs/caching.html

2 голосов
/ 11 декабря 2010

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

Вы можете попробовать это очень просто на Mac.Запустите простой сервер с netcat (nc) на каком-то порту, скажем, 9090:

nc -l 9090

Создайте простую страницу со ссылкой на http://localhost:9090, нажмите на нее и посмотрите заголовкиВаша команда nc отобразит.

Вручную верните ответ, набрав его в nc, например, что-то вроде

HTTP/1.0 200 OK
ETag: "xyz"
Content-type: text/plain

Some text.

Нажмите ссылку еще раз и увидите заголовок If-None-Match в запросе.Сделайте возврат после адреса в адресной строке, и вы увидите, что Safari не отправляет заголовок.

0 голосов
/ 28 ноября 2013

Я опубликовал новую проблему, чтобы запросить эту функцию в конфигурации appengine-web.xml.

Пожалуйста, проверьте и проголосуйте за нее!

https://code.google.com/p/googleappengine/issues/detail?id=10339&sort=-id&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log

...