Чому Apache надсилає 200 ОК під час останньої модифікації, якщо з моменту зміни?


10

Я намагаюся мати основну поведінку щодо моєї стратегії кешування: файли потрібно кешувати та повторно перевіряти з сервером кожен раз. Тому я хотів би, щоб Apache надіслав 304 назад.

Ось діалогове вікно, яке відбувається для кожного оновлення браузера:

Status Code:200 OK

Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

Response Headers

Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding

(це з хромованих розробників, з вимкненим кешем не встановлено)

Ви можете бачити, що відповідь містить заголовок кеша: управління без кешу, і що заголовок If-modified-since відповідає Останньо зміненому. ETag теж відповідає.

Чи не повинен Apache надсилати номер 304 у такому випадку?

EDIT

Відключення ETags в апачі з

 Header  unset ETag

робить поведінку кешування більш передбачуваним ...


Я думаю, що Cache-Control:max-age=0вимкнено кеш, тому ви бачите Cache-Control:No-cacheвідповідь.
ThoriumBR

Я чітко встановив Cache-Control: No-cache у моїй конфігурації apache, тому що з w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 я розумію, що це викликає повторну перевірку для кожного запиту. Чи означає повторне підтвердження повторного надсилання файлу? Я б сказав, що слід використовувати If-modified-since, щоб визначити, чи є 200, або 304.
zrz

Відповіді:


8

Здається, це стара помилка , яка пояснює, чому Header unset ETagмає значення.

Apache 2.4.0++ автоматично додає назву методу стиснення до ETag (як видно з ваших заголовків) і запобігає відповіді 304.

Найновіші версії mod_deflate підтримують DeflateAlterETag, який можна використовувати для контролю такої поведінки:

DeflateAlterETag NoChange

3
Це правильно, але Apache 2.4 не містить цього параметра, лише Apache 2.5. Однак особисто я не вважаю ETags кориснішими, оскільки Apache спирає їх на останню змінену дату, а не на вміст файлу. Тож відключення ETags повертається до заголовка If-Modified-Since, який так чи інакше базується на останній зміненій даті. Ви можете змінити ETag в Apache, щоб зробити його виходячи з розміру, останньо модифікованого та / або inode - розміром та останньою модифікацією за замовчуванням -, але поки вони не додадуть опцію для обчислення ETag на основі контрольної суми вмісту файлу, його обмежене використання ІМХО. Тому я їх відключаю.
Баррі Поллард

1
@BazzaDP Це має сенс. 2.5 також є DeflateAlterETag Removeможливість зробити саме це
Матіас Р. Єссен

0

Цей запит виділяється трохи запитом:

Cache-Control:max-age=0

Напевно, важливіше, я помічаю, що повертається вміст - HTML. Це динамічно генерується? Apache МОЖЕ надіслати відповідь 304, але якщо ви не подаєте статичний вміст, то не потрібно Apache здійснювати цей виклик, і це зводиться до логіки вашої програми. Наприклад, більшість програм php мають обмежену підтримку таких речей.

Кеш на передньому кінці може допомогти, оскільки додаток кешування може перевіряти час модифікації, етаг тощо, але тільки якщо і додаток, і заголовки запиту є кешовими. Наприклад, програма повинна встановити відповідні заголовки, щоб вказати, що вміст є кешованим, і такі речі, як заголовок кеш-керування у вашому запиті, зведе нанівець кеш. Ваші заголовки не виглядають кеш-дружніми.


Запитаний файл - це статичний HTML-файл, для якого Apache отримує правильний час модифікації. (Останнє змінення: вторник, 14 жовтня 2014 15:10:37 GMT). заголовок max-age = 0 міститься у запиті, надісланому chrome, коли я набираю URL-адресу та натискаю Enter. Чи є це через попередні відповіді?
zrz

Я прочитав, що Chrome автоматично додає кеш-контроль: max-age = 0 на запит (за винятком першого завантаження Chrome, введіть URL-адресу, натисніть клавішу Enter). Але це, мабуть, не впливає на інші сервери (CDN-адреси надсилають 304 навіть при max-age = 0 у запиті).
zrz

@zrz: обмеження кеш-посередництва дуже корисно при налагодженні, але в іншому випадку зашкодить продуктивності. Перевірте контекст того, що ви прочитали, і що робить хром. З точки зору того, що робить апаш, це цілком можна налаштувати. Кеш-контроль - це інструкція для посередницьких кешів, а не для початкового сервера. Однак апаш може виступати як кеш-посередник і може бути налаштований на всілякі речі. Я думаю, якщо ви вийдете з інструкцій щодо кешування, ви отримаєте поведінку більше, як те, що ви очікуєте від початкового сервера.
mc0e

0

Якщо у вас налаштований Apache Cache-Control:No-cache, Apache ніколи не надсилатиме HTTP 304 Not modifiedклієнту.

Якщо ви хочете повторно підтвердити деякі запити, розмістіть Cache-Control:No-cacheлише на тих сторінках, де вам це потрібно. Вам не потрібно повторно підтверджувати всі ресурси, і ви витрачаєте пропускну здатність, роблячи це.


Мені здається, бентежить термін "переоцінити". Для мене це означає перевірити, чи це 304. Чи помиляюся?
zrz

Ви неправі. Revalidate - це надіслати всі дані клієнту знову і змусити його знову все прочитати, навіть якщо він вже має ту саму інформацію. Ви в основному вимикаєте кеш для кожного клієнта.
ТорійБР

Це багато що пояснює. Останнє, що мені потрібно пояснити, маючи це на увазі, це те, що Apache надсилає 304 для деяких ресурсів (наприклад, png), в той час як у мене все ще є те, що кеш-контроль не відповідає кешу у відповіді та до max-age = 0 у запиті. Якась підказка?
zrz

@ThoriumBR Якщо я вас правильно інтерпретував, обидві ваші відповіді тут неправильні; no-cache (на відміну від no-store) не означає "не кешувати", і може призвести до 304, якщо вміст не змінився. Дійсно, ОП очікувала цього, але не отримала цього через етаг. must-Revalidate стосується того, як обробляється застарілий вміст і не завжди надсилає "дані знову".
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.