Saya mencoba untuk memiliki perilaku dasar mengenai strategi caching saya: file harus di-cache, dan divalidasi kembali dengan server setiap kali. Jadi saya ingin Apache mengirim kembali 304.
Berikut adalah dialog yang terjadi untuk setiap pembaruan browser:
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
(ini dari chrome devtools, dengan Nonaktifkan cache tidak dicentang)
Anda dapat melihat bahwa respons berisi Header Cache-Control: No-cache, dan header If-modified-since cocok dengan Last-modified. ETag juga cocok.
Bukankah seharusnya Apache mengirim 304 dalam kasus itu?
EDIT
Menonaktifkan ETag dalam apache dengan
Header unset ETag
membuat perilaku caching lebih dapat diprediksi ...
Cache-Control:max-age=0
menonaktifkan cache, sehingga Anda melihatCache-Control:No-cache
jawabannya.Jawaban:
Tampaknya ini adalah bug lama , menjelaskan mengapa
Header unset ETag
ada perbedaan.Apache 2.4.0+ secara otomatis menambahkan nama metode kompresi ke ETag (seperti yang terlihat di header Anda), dan mencegah respons 304.
Versi mod_deflate terbaru mendukung DeflateAlterETag yang dapat digunakan untuk mengontrol perilaku ini:
sumber
DeflateAlterETag Remove
opsi untuk melakukan hal ituYang ini menonjol dalam permintaan sebagai agak aneh:
Namun sepertinya lebih penting, saya perhatikan bahwa konten yang dikembalikan adalah html. Apakah ini dihasilkan secara dinamis? Apache MUNGKIN mengirim respons 304, tetapi kecuali Anda menyajikan konten statis, itu bukan tugas Apache untuk melakukan panggilan itu, dan itu tergantung pada logika aplikasi Anda. Misalnya sebagian besar aplikasi php memiliki dukungan terbatas untuk hal-hal seperti itu.
Cache ujung depan dapat membantu, karena aplikasi caching dapat memeriksa waktu modifikasi, etag, dll., Tetapi hanya jika aplikasi dan header permintaan ramah terhadap cache. Misalnya aplikasi harus mengatur tajuk yang tepat untuk menunjukkan bahwa konten tersebut dapat di-cache, dan hal-hal seperti tajuk kontrol Cache dalam permintaan Anda akan meniadakan cache. Header Anda tidak terlihat ramah cache.
sumber
Jika Anda memiliki Apache yang dikonfigurasi
Cache-Control:No-cache
, Apache tidak akan pernah mengirimHTTP 304 Not modified
ke klien.Jika Anda ingin memvalidasi ulang beberapa permintaan, letakkan
Cache-Control:No-cache
hanya pada halaman di mana Anda membutuhkannya. Anda tidak perlu memvalidasi ulang semua sumber daya, dan Anda menghabiskan bandwidth dengan melakukannya.sumber