Perbedaan antara header Pragma dan Cache-Control?

166

Saya membaca tentang tajuk Pragma di Wikipedia yang mengatakan:

"Pragma: no-cache header field adalah header HTTP / 1.0 yang dimaksudkan untuk digunakan dalam permintaan. Ini adalah sarana bagi browser untuk memberi tahu server dan semua cache perantara bahwa ia menginginkan versi sumber daya yang baru, bukan untuk server untuk memberi tahu browser agar tidak men-cache sumber daya. Beberapa agen pengguna memperhatikan tajuk ini dalam tanggapan, tetapi HTTP / 1.1 RFC secara khusus memperingatkan agar tidak mengandalkan perilaku ini. "

Tapi saya belum mengerti apa fungsinya? Apa perbedaan antara Cache-Controltajuk yang nilainya no-cachedan Pragmayang nilainya juga no-cache?

saplingPro
sumber

Jawaban:

196

Pragmaadalah implementasi HTTP / 1.0 dan cache-controlmerupakan implementasi HTTP / 1.1 dari konsep yang sama. Keduanya dimaksudkan untuk mencegah klien dari caching respons. Klien yang lebih tua mungkin tidak mendukung HTTP / 1.1 yang mengapa tajuk itu masih digunakan.

Eric Brenden
sumber
31
Meskipun jawaban cnst di bawah ini jauh lebih rumit, itu juga jauh lebih benar sesuai dengan spesifikasi. Pragma: no-cachedimaksudkan untuk digunakan hanya dalam permintaan (artinya "Saya ingin yang asli, bukan salinan yang di-cache") dan perilakunya tidak ditentukan untuk tanggapan.
iklim
5
Cache-Control: no-cachememiliki arti yang sama untuk permintaan tetapi sebenarnya juga didefinisikan untuk tanggapan, yang berarti "Jika Anda ingin menggunakan salinan cache ini di masa mendatang, Anda harus terlebih dahulu memeriksa dengan saya bahwa itu adalah yang terbaru (yaitu melakukan validasi ulang)".
iklim
3
Ini untuk Kontrol Cache, tidak harus HANYA untuk mencegah cache, itu juga dapat digunakan untuk mengatakan "Anda dapat men-cache ini." ....
jave.web
Jawaban dasar. Untuk membuatnya lebih rumit: Ini juga header permintaan yang berarti Anda juga dapat mengirim no-cache ke server. Dan itu sebenarnya berarti mengembalikan konten basi ke klien, APA ?? Sekarang Anda lupa ini dan baca jawaban sederhana di atas dan nikmati hidup Anda, jangan gali terlalu keras lol
sotn
Keduanya dimaksudkan untuk mencegah klien dari caching respon adalah catatan yang membingungkan bagi pembaca. Itu juga dapat memiliki max-ageyang tidak mencegah caching. Itu hanya menetapkan tanggal kedaluwarsa untuk itu ...
Sayang
97

Tidak ada perbedaan, kecuali yang Pragmahanya didefinisikan sebagai berlaku untuk permintaan oleh klien, sedangkan Cache-Controldapat digunakan oleh permintaan klien dan balasan dari server.

Jadi, sejauh standar berjalan, mereka hanya dapat dibandingkan dari perspektif klien membuat permintaan dan server menerima permintaan dari klien. The http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 mendefinisikan skenario sebagai berikut:

Cache HTTP / 1.1 HARUS memperlakukan "Pragma: no-cache" seolah-olah klien telah mengirim "Cache-Control: no-cache". Tidak ada arahan Pragma baru yang akan didefinisikan dalam HTTP.

  Note: because the meaning of "Pragma: no-cache as a response
  header field is not actually specified, it does not provide a
  reliable replacement for "Cache-Control: no-cache" in a response

Cara saya membaca di atas:

  • jika Anda sedang menulis klien dan perlu no-cache:

    • cukup gunakan Pragma: no-cachedalam permintaan Anda, karena Anda mungkin tidak tahu jika Cache-Controldidukung oleh server;
    • tetapi dalam balasan, untuk memutuskan apakah akan melakukan cache, periksa Cache-Control
  • jika Anda sedang menulis server:

    • dalam parsing permintaan dari klien, periksa Cache-Control; jika tidak ditemukan, periksa Pragma: no-cache, dan jalankan Cache-Control: no-cachelogika;
    • dalam balasan, berikan Cache-Control.

Tentu saja, kenyataan mungkin berbeda dari apa yang tertulis atau tersirat dalam RFC!

cnst
sumber
5
Bagaimana jika header memiliki keduanya? Cache-Control: max-age=86400dan Pragma: no-cache? Yang mana yang kemudian akan dihormati oleh browser modern?
PKHunter
3
@PKHunter, mengapa Anda peduli ke mana ia pergi jika perilaku tidak terdefinisi? Jika Anda bertanggung jawab untuk server, jelas Anda dapat melakukan lebih baik daripada memberikan informasi yang menyesatkan kepada klien. Juga, seperti yang ditunjukkan dalam jawaban saya, Pragma: no-cachehanya ditentukan untuk permintaan dari browser, dan dengan demikian akan sepenuhnya tidak valid dan tidak ditentukan dalam balasan dari server ke browser, misalnya, saya membayangkan bahwa setiap browser tunggal (apakah modern atau tidak) harus mengabaikan tajuk seperti itu dalam balasan apa pun yang mungkin diterimanya.
cnst
3
Peramban modern harus mengabaikan Pragma yang mendukung Kontrol-Cache jika keduanya ada karena yang terakhir dapat menentukan periode waktu dan informasi lain yang tidak tersedia dalam protokol awal 1.0.
Randall Borck
17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

Jika setelah 1999, dan Anda masih menggunakan Kedaluwarsa atau Pragma , Anda salah melakukannya.

Saya melihat Anda Stackoverflow:

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr: Pragmaadalah warisan HTTP / 1.0 dan belum diperlukan sejak Internet Explorer 5, atau Netscape 4.7. Kecuali Anda mengharapkan beberapa pengguna menggunakan IE5: aman untuk berhenti menggunakannya.


  • Kedaluwarsa: [date] (tidak digunakan lagi - HTTP 1.0)
  • Pragma: tanpa cache (tidak digunakan lagi - HTTP 1.0)
  • Kontrol Cache: max-age =[seconds]
  • Cache-Control: no-cache (harus memvalidasi ulang salinan yang di-cache setiap kali)

Dan permintaan bersyarat:

  • Permintaan bersyarat berdasarkan Etag (tag entitas)
    • Server: Etag: W/“1d2e7–1648e509289”
    • Klien: If-None-Match: W/“1d2e7–1648e509289”
    • Server: 304 Not Modified
  • Permintaan bersyarat berdasarkan tanggal yang dimodifikasi
    • Server: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Klien: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Server: 304 Not Modified

terakhir diubah: Kamis, 09 Mei 2019 19:15:47 GMT

Ian Boyd
sumber
2
RFC mengatakan Anda harus menggunakan keduanya, seandainya klien tidak mendukung Cache-Control: tools.ietf.org/html/rfc7234#page-29
Randall Borck
3
The klien "harus" mencakup baik - kecuali ia ingin mengobati HTTP server / 1.1 dan HTTP / 1.0 caching berbeda. Server seharusnya tidak termasuk Pragmasama sekali. (Dalam HTTP / 1.0, Pragma didefinisikan sebagai bidang yang dapat diperluas untuk arahan yang ditentukan implementasi untuk penerima. Spesifikasi ini mencabut ekstensi tersebut untuk meningkatkan interoperabilitas.)
Ian Boyd
2
Dari sudut pandang keamanan, disarankan untuk menggunakannya. Banyak browser mengikuti pragma: direktif tanpa cache, jadi disarankan untuk menggunakannya oleh OWASP: owasp.org/index.php/…
Randall Borck
2
@RallallBorck: Anda menyebarkan informasi yang sudah ketinggalan zaman (dua dekade, tidak kurang!). Tidak ada browser yang mengikuti arahan Pragma lagi, kecuali sekarang 1999. Ini adalah saran pemujaan kargo: "tidak ada ruginya dan kami selalu melakukannya, oleh karena itu bagus dan perlu."
Piskvor meninggalkan gedung
2
@Piskvor Sebagian besar server masih mendukung 1.0 dan 1.1, jadi kecuali Anda secara aktif memblokir permintaan HTTP / 1.0 Anda tidak memilih protokol mana yang digunakan klien. Sebagian besar pengembang saat ini tidak perlu repot untuk memblokir 1.0, oleh karena itu masih merupakan praktik terbaik, bahkan pada tahun 2019.
Randall Borck