Pragma ve Cache-Control başlıkları arasındaki fark nedir?


166

Wikipedia'da Pragma başlığını okudum :

"Pragma: no-cache üstbilgi alanı, isteklerde kullanılmak üzere tasarlanmış bir HTTP / 1.0 üstbilgisidir. Tarayıcının sunucuya ve ara önbelleklere sunucunun değil, kaynağın yeni bir sürümünü istediğini bildirmesi için bir araçtır Bazı kullanıcı aracıları yanıtlarda bu başlığa dikkat ediyor, ancak HTTP / 1.1 RFC özellikle bu davranışa güvenmemek için uyarıyor. "

Ama ne anlama geldiğini anlamadım? Cache-ControlDeğeri olan no-cacheve Pragmadeğeri de olan başlık arasındaki fark nedir no-cache?

Yanıtlar:


196

PragmaHTTP / 1.0 uygulamasıdır ve cache-controlaynı kavramın HTTP / 1.1 uygulamasıdır. Her ikisi de müşterinin yanıtı önbelleğe almasını önlemek içindir. Eski istemciler HTTP / 1.1'i desteklemeyebilir, bu nedenle bu başlık hala kullanımdadır.


31
Aşağıdaki cnst cevabı çok daha karmaşık olmasına rağmen, spesifikasyona göre çok daha doğrudur. Pragma: no-cacheyalnızca isteklerde kullanılmak üzere tasarlanmıştır ("Orijinali istiyorum, önbelleğe alınmış bir kopya değil") ve davranışı yanıtlar için belirtilmedi.
clime

5
Cache-Control: no-cacheistekleri için aynı anlama gelir, ancak aslında yanıtlar için de tanımlanır.
Clime

3
Bu Önbellek Kontrolü içindir, SADECE önbellek önleme için olmak zorunda değildir, "Bunu önbelleğe alabilirsiniz" demek için de kullanılabilir. ....
jave.web

Temel cevap. Daha karmaşık hale getirmek için: Bu aynı zamanda bir istek başlığıdır, yani sunucuya önbellek de gönderemezsiniz. Ve bu aslında eski içeriği istemcilere döndürmek anlamına gelebilir, NE ?? Şimdi bunu unutun ve yukarıdaki basit cevabı okuyun ve hayatınızın tadını çıkarın, çok zor
kazmayın

Her ikisi de, istemcinin yanıtı önbelleğe almasını önlemek için okuyucular için kafa karıştırıcı bir nottur. Ayrıca max-ageönbelleğe almayı engellemeyebilir. Sadece bunun için bir son kullanma tarihi belirliyor ...
Bal

97

Farkı yoktur, ancak bunun Pragmasadece müşterinin istekleri için geçerli olduğu tanımlanırken, Cache-Controlhem istemcilerin istekleri hem de sunucuların cevapları tarafından kullanılabilir.

Bu nedenle, standartlar söz konusu olduğunda, yalnızca istekte bulunan istemci ve istemciden istek alan sunucu açısından karşılaştırılabilirler. Http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 tanımlar senaryo olarak aşağıdaki gibidir:

HTTP / 1.1 önbellekleri "Pragma: no-cache" ye istemci "Cache-Control: no-cache" göndermiş gibi davranmalıdır. HTTP'de yeni Pragma yönergesi tanımlanmayacaktır.

  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

Yukarıda okudum yolu:

  • bir müşteri yazıyorsanız ve ihtiyacınız varsa no-cache:

    • sadece Pragma: no-cacheisteklerinizde kullanın , çünkü Cache-Controlsunucu tarafından desteklenip desteklenmeyeceğini bilemeyebilirsiniz ;
    • ancak yanıtlarda, önbelleğe alınıp alınmayacağına karar vermek için Cache-Control
  • bir sunucu yazıyorsanız:

    • müşterilerden gelen istekleri ayrıştırmada kontrol edin Cache-Control; bulunmazsa, mantığı kontrol edin Pragma: no-cacheve yürütün Cache-Control: no-cache;
    • yanıtlarda, sağlayın Cache-Control.

Elbette gerçeklik, RFC'de yazılan veya ima edilenlerden farklı olabilir!


5
Başlıkta her ikisi de varsa ne olur? Cache-Control: max-age=86400ve Pragma: no-cache? O zaman hangisi modern tarayıcılar tarafından onurlandırılacak?
PKHunter

3
@PKHunter, davranış tanımsızsa neden hangi yöne gittiğini umursasın ki? Sunucudan sorumluysanız, istemciye yanıltıcı bilgiler vermekten daha iyisini yapabilirsiniz. Ayrıca, cevabımda işaret edildiği gibi Pragma: no-cache, sadece tarayıcıdan gelen istekler için tanımlanmıştır ve bu nedenle sunucudan tarayıcıya verilen yanıtlarda tamamen geçersiz ve tanımsız olacaktır, örneğin, her bir tarayıcının (ister modern ister not) alabileceği herhangi bir yanıtta böyle bir başlığı göz ardı etmelidir.
cnst

3
Modern bir tarayıcı Pragma'yı Önbellek Kontrolü lehine görmezden gelmelidir, çünkü her ikisi de ilk 1.0 protokolünde bulunmayan zaman periyotlarını ve diğer bilgileri belirtebilir.
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          |

1999'dan sonraysa ve hala Expires veya Pragma kullanıyorsanız , yanlış yapıyorsunuz.

Sana bakıyorum 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: PragmaHTTP / 1.0'ın bir mirasıdır ve Internet Explorer 5 veya Netscape 4.7'den beri gerekli değildir. Bazı kullanıcılarınızın IE5 kullanmasını beklemediğiniz sürece: kullanmayı bırakmak güvenlidir.


  • Sona erme tarihi: [date] (kullanımdan kaldırıldı - HTTP 1.0)
  • Pragma: önbellek yok (kullanımdan kaldırıldı - HTTP 1.0)
  • Önbellek Kontrolü: maks. Yaş =[seconds]
  • Önbellek Kontrolü: önbellek yok (önbelleğe alınan kopyayı her seferinde yeniden doğrulamalıdır)

Ve şartlı istekler:

  • Etag (varlık etiketi) tabanlı koşullu istekler
    • Sunucu: Etag: W/“1d2e7–1648e509289”
    • Müşteri: If-None-Match: W/“1d2e7–1648e509289”
    • Sunucu: 304 Not Modified
  • Değiştirilmiş tarih tabanlı koşullu istekler
    • Sunucu: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Müşteri: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Sunucu: 304 Not Modified

son değiştirilme tarihi: Perş, 09 Mayıs 2019 19:15:47 GMT


2
RFC, bir istemcinin Cache-Control'ü desteklememesi durumunda her ikisini de kullanmanız gerektiğini söylüyor: tools.ietf.org/html/rfc7234#page-29
Randall Borck

3
İstemci "gerektiğini etmek" ikisini de - bu farklı HTTP / 1.1 ve HTTP / 1.0 önbelleğe alma sunucuları tedavi etmek istemiyorsa. Sunucu içermemelidirPragma . (HTTP / 1.0'da Pragma, alıcılar için uygulama tarafından belirtilen yönergeler için genişletilebilir bir alan olarak tanımlanmıştır. Bu belirtim, birlikte çalışabilirliği geliştirmek için bu uzantıları kullanımdan kaldırmıştır.)
Ian Boyd

2
Güvenlik açısından, kullanılması tavsiye edilir. Birçok tarayıcı pragmayı izler
Randall Borck

2
@RandallBorck: Güncel olmayan bilgileri (yirmi yıl, daha az değil!) Yayıyorsunuz. Pragma direktifini 1999'dan önce artık takip eden hiçbir tarayıcı yok . Bu kargo kült tavsiyesidir: "zarar vermez ve her zaman yaptık, bu yüzden iyi ve gerekli."
Piskvor

2
@Piskvor Çoğu sunucu hala 1.0 ve 1.1'i desteklemektedir, bu nedenle HTTP / 1.0 isteklerini etkin bir şekilde engellemezseniz, istemcinin hangi protokolü kullandığını seçmezsiniz. Bugün çoğu geliştirici 1.0'ı engellemeye zahmet etmiyor, bu yüzden 2019'da bile hala en iyi uygulama.
Randall Borck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.