我曾经认为缓存是浏览器驱动的,浏览器不会再次请求同一个文件,如果他们认为数据是重复的,但在网上阅读一些文本,我意识到这是网站,告诉浏览器哪些文件不应该请求两次。有谁能澄清一下吗?
c3frrgcw1#
是的,它由HTTP的Cache-Control和Expires头控制。第一个基本上告诉客户该高速缓存策略,第二个基本上告诉客户端缓存策略的到期时间(即,在获得新响应和/或丢弃缓存的响应之前,坚持缓存策略多长时间)。Web服务器通常会发送一组默认的头文件。您可以在服务器配置中永久设置/覆盖这些头文件,也可以在PHP中使用header()函数根据请求设置/覆盖这些头文件。以下示例指示客户端永远不要缓存响应。
Cache-Control
Expires
header()
header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0');
Pragma报头用于确保与旧HTTP 1.0客户端的兼容性,旧HTTP 1.0客户端还不支持Cache-Control(在HTTP 1.1中引入)。如果该高速缓存已过期,并且高速缓存的响应还包含Last-Modified和/或ETag标头,则客户机可以触发具有If-Modified-Since和/或If-None-Match的条件GET请求。只要If-Modified-Since和/或If-None-Match条件为正,则服务器将发回不包含任何内容的304“未修改”响应。如果发生这种情况,则允许客户端将当前高速缓存的内容保持该高速缓存中并更新报头。
Pragma
Last-Modified
ETag
If-Modified-Since
If-None-Match
GET
ilmyapht2#
如果满足If-Modified-Since/If-Unmodified-Since HTTP请求头中给定的条件,则可以使用它们来请求页面。浏览器可以使用ETag响应头来判断页面中的数据是否已更改。这些标记可以通过HEAD请求来检索。服务器可以使用Expires、Cache-Control和Pragma响应头让浏览器知道何时应该尝试获取页面的新副本,而不是使用缓存。
If-Unmodified-Since
HEAD
cotxawn73#
缓存控制站点的一些方法....通过设置HTTP头(CGI脚本等)进行编程通过标签()网络服务器配置文件(httpd.conf,web.config)这将取决于Web服务器类型,例如Apache、伊萨等。良好资源:http://en.wikipedia.org/wiki/Web_cache
dgenwo3n4#
如果你想获得比HTTP所允许的更大的控制权,你可以使用manifest.cache,这是一个浏览器获取的文件,其中包含一个资源列表--如果文件没有被修改,浏览器根本不会重新请求它。参见:www.example.comhttp://diveintohtml5.ep.io/offline.html#manifest虽然这是所有"现代"的Web浏览器都支持的,但如果浏览器不支持它,它将照常工作(即完全依赖于您的HTTP头,其他人在他们的回答中已经描述过)。
manifest.cache
rt4zxlrg5#
这可能有助于理解至少在internet explorer中是如何处理缓存的。Caching Improvements in Internet Explorer 9
5条答案
按热度按时间c3frrgcw1#
是的,它由HTTP的
Cache-Control
和Expires
头控制。第一个基本上告诉客户该高速缓存策略,第二个基本上告诉客户端缓存策略的到期时间(即,在获得新响应和/或丢弃缓存的响应之前,坚持缓存策略多长时间)。
Web服务器通常会发送一组默认的头文件。您可以在服务器配置中永久设置/覆盖这些头文件,也可以在PHP中使用
header()
函数根据请求设置/覆盖这些头文件。以下示例指示客户端永远不要缓存响应。Pragma
报头用于确保与旧HTTP 1.0客户端的兼容性,旧HTTP 1.0客户端还不支持Cache-Control
(在HTTP 1.1中引入)。如果该高速缓存已过期,并且高速缓存的响应还包含
Last-Modified
和/或ETag
标头,则客户机可以触发具有If-Modified-Since
和/或If-None-Match
的条件GET
请求。只要If-Modified-Since
和/或If-None-Match
条件为正,则服务器将发回不包含任何内容的304“未修改”响应。如果发生这种情况,则允许客户端将当前高速缓存的内容保持该高速缓存中并更新报头。ilmyapht2#
如果满足
If-Modified-Since
/If-Unmodified-Since
HTTP请求头中给定的条件,则可以使用它们来请求页面。浏览器可以使用
ETag
响应头来判断页面中的数据是否已更改。这些标记可以通过HEAD
请求来检索。服务器可以使用
Expires
、Cache-Control
和Pragma
响应头让浏览器知道何时应该尝试获取页面的新副本,而不是使用缓存。cotxawn73#
缓存控制站点的一些方法....
通过设置HTTP头(CGI脚本等)进行编程
通过标签()
网络服务器配置文件(httpd.conf,web.config)
这将取决于Web服务器类型,例如Apache、伊萨等。
良好资源:http://en.wikipedia.org/wiki/Web_cache
dgenwo3n4#
如果你想获得比HTTP所允许的更大的控制权,你可以使用
manifest.cache
,这是一个浏览器获取的文件,其中包含一个资源列表--如果文件没有被修改,浏览器根本不会重新请求它。参见:www.example.comhttp://diveintohtml5.ep.io/offline.html#manifest
虽然这是所有"现代"的Web浏览器都支持的,但如果浏览器不支持它,它将照常工作(即完全依赖于您的HTTP头,其他人在他们的回答中已经描述过)。
rt4zxlrg5#
这可能有助于理解至少在internet explorer中是如何处理缓存的。
Caching Improvements in Internet Explorer 9