HTTP-кэширование - проверка на изменение файла работает с HTML, но не с XML - Chrome - PullRequest
0 голосов
/ 03 августа 2011

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

У вызова html-страницы (index.html) есть следующие заголовки в ответе:

HTTP/1.1 200 OK
Cache-Control: public,max-age=7776000
Content-Type: text/plain
Content-Encoding: gzip
Last-Modified: Wed, 13 Jul 2011 13:02:04 GMT
Accept-Ranges: bytes
ETag: "e07f1e105d41cc1:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 03 Aug 2011 11:47:47 GMT
Content-Length: 242

У вызова xml-страницы (application-context-dashboard.xml) есть следующиеЗаголовки в ответе:

HTTP/1.1 200 OK
Cache-Control: public,max-age=7776000
Content-Type: text/xml
Content-Encoding: gzip
Last-Modified: Wed, 03 Aug 2011 11:31:56 GMT
Accept-Ranges: bytes
ETag: "10ba5f3d051cc1:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 03 Aug 2011 11:47:14 GMT
Content-Length: 457

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

304 вызов index.html: Запрос:

GET /edumatic3/trunk/backend/index.html HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nl,en-US;q=0.8,en;q=0.6,fr;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: CurrenUICulture=en-us
If-None-Match: "e8626a973e45cc1:0"
If-Modified-Since: Mon, 18 Jul 2011 11:34:01 GMT

Есть ли способ добиться того же результата для xmlфайл?+ Почему это работает для HTML, а не для XML?Два заголовка для начального запроса кажутся идентичными.

Браузер: Chrome.

Та же проблема для другого статического содержимого, такого как swf, txt, ...

ОБНОВЛЕНИЕ:

Очевидно, что Chrome выполняет задание OK для index.html, но Firefox, например, не ...

1 Ответ

1 голос
/ 04 августа 2011

При перезагрузке страницы браузер должен проверить, обновлена ​​ли она. Так что он будет запрашивать страницу снова. Заголовки запросов If-None-Match и If-Modified-Since позволяют вашему серверу возвращать ответ 304 Not Modified.

Для других элементов на странице выполняется кэширование, как и должно быть. Ваш первый ответ содержал заголовок Cache-Control: public, max-age = 7776000. Таким образом, вы говорите браузеру не проверять этот файл в течение следующих трех месяцев. Удалите часть max-age и добавьте must-revalidate, если вы хотите, чтобы браузер запрашивал каждый файл снова и снова. ETag по-прежнему позволяет отправлять 304.

Более подробное объяснение вы найдете в RFC 2616, Раздел 14.9.4 Элементы управления проверкой и перезагрузкой кэша .

...