如何设置HTTP标头(用于缓存控制)?


237

如何为我的网站启用浏览器缓存?我是否只是将cache-control:public这样放在标题中?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

我正在使用最新版本的XAMPP开发的最新版本的PHP。


您正在使用哪种服务器端语言?PHP?,ASP?,JSP?设置标题的方式相似但不完全相同。或者,如果您要缓存图像...通常,这是在您的Apache(或Web服务器)配置中完成的
scunliffe 2010年

遗憾的是,“解决方案”只会生成一个无效的DOCTYPE ;-)如果您希望通过HTML进行操作(我不推荐这样做),则可以使用META HTTP-EQUIV

Answers:


198

要在HTML中使用缓存控制,请使用meta标签,例如

<meta http-equiv="Cache-control" content="public">

内容字段中的值定义为以下四个值之一。

Cache-Control标头上的一些信息如下

HTTP 1.1。允许值= PUBLIC | 私人| NO-CACHE | 没有商店。

公共-可能会缓存在公共共享缓存中。
专用-只能缓存在专用缓存中。
无缓存-可能不会被缓存。
无存储-可以缓存但不能存档。

指令CACHE-CONTROL:NO-CACHE指示不应使用缓存的信息,而应将请求转发到原始服务器。该指令与PRAGMA:NO-CACHE具有相同的语义。

当向服务器发送不缓存请求时,客户端应同时包括PRAGMA:NO-CACHE和CACHE-CONTROL:NO-CACHE。另请参阅EXPIRES。

注意:在HTTP中指定缓存命令可能比在META语句中指定缓存命令更好,因为在META语句中,它们可能比浏览器影响更大,但是代理和其他可能会缓存信息的中间媒介。


30
HTML5禁止这样做<meta>并且一直是指定缓存的一种糟糕且易变的方式。
Kornel 2014年

1
@porneL我很难理解您的链接的哪一部分禁止答案的哪一部分... meta标签规范对拒绝或禁止此处写的内容一言不发。
费利克斯Gagnon的-格雷尼尔

1
@FélixGagnon-Grenier“ http-equiv属性是枚举属性”表示它仅允许使用规范表中的值。它甚至在后面的部分中调用缓存(“其他pragma指令”):>一定不要注册与影响HTTP处理模型(例如,缓存)的标头相对应的Pragma指令,因为它们会导致HTTP级别的行为对于与未实现HTML的用户代理相比,实现HTML的用户代理。
Kornel

3
引用的文档的值不正确no-store(尽管文档本身引用RFC 2068)- no-store防止文档在任何地方被存储/缓存。尽管no-cache确实允许存储它,但是它每次都必须与服务器进行检查。浏览器将趋于商店no-cache页面,以使后退按钮功能
MrWhite

3
谷歌提供IMO缓存为HTTP最简单的参考之一:developers.google.com/web/fundamentals/performance/...
MrWhite

137

您可以 使用以下方法在PHP中设置标头

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

请注意,使用的确切标头将取决于您的需要(以及是否需要支持HTTP 1.0和/或HTTP 1.1


3
Pragma并且Expires很可能冗余绝大多数浏览器。fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai是的,HTTP / 1.0也在很大程度上过时了……仅根据用户矩阵使用您需要的标头
scunliffe

49

如我所写,最好使用该文件.htaccess。但是,请注意将内容保留在缓存中的时间。

用:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

其中:604800 = 7天

PS:这可用于重置任何标头


30

http://www.askapache.com/htaccess/apache-speed-cache-control.html上的页面建议使用以下内容:

添加缓存控制标头

这放在您的根.htaccess文件中,但是如果您可以访问httpd.conf,那更好。

此代码使用FilesMatch指令和Header指令将Cache-Control Headers添加到某些文件。

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3
订单重要吗?“ max-age = 290304000,公共”或“ public,max-age = 290304000”,或者两者都正确吗?
萨蒂亚·普拉卡什

2
如果值不冲突(如cacheno-cache),则顺序无关紧要。max-age并且public不要冲突,因此顺序无关紧要。
布莱斯

1
请注意,由于它使用了Header指令,因此必须启用mod_headers
Skippy le Grand Gourou

@Skippy le Grand Gourou我如何启用mod_headers?
山姆

@SamuelStratford我读到它在其他发行版上有所不同,但是在Debian下,您可以使用a2enmod或建立从/etc/apache2/mods-available/headers.load到的符号链接/etc/apache2/mods-enabled/headers.load
Skippy le Grand Gourou

21

这是.htaccess我在实际网站中使用过的最好的软件:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>

3
.htaccess文件的几乎完美示例...如果包括特定的图像以及如何将图像写入图像的路径以及将.htaccess文件放置在何处(例如,在图像目录或索引目录中),将是完整的。 。例如。'<IfModule mod_headers.c> <Files /img/myimage.jpg>标头附加高速缓存控件“ max-age = 3600,必须重新验证” </ Files> </ IfModule>'...这行得通吗? ....或粘贴到img dir'<filesmatch“ ^(example \ .jpg | sample \ .png)$”>标头设置缓存控件“ max-age = 31536000,公共” </ filesmatch>。 。一个都是一样的策略似乎有风险的-反正具体的例子将是巨大的,如果POSS
马尔科- UandL

2
仅供参考:JS和CSS文件上的gzip压缩可以帮助破坏SSL加密。如果您依赖安全性,请不要开启gzip
Eduard Void

1
这是在缓存登录帐户页面,因此您无法从帐户中注销。更糟糕的是,有人不能仅仅访问帐户页面并以上次用户登录来登录。不建议在电子商务网站上使用,然后应删除<filesMatch "\.(x?html?|php)$">以避免缓存静态HTML页面。其余文件匹配都可以。
nicoX

1
您已复制<filesmatch "\.(eot|woff|otf|ttf|svg)$">
nicoX

2
您可以设置cssjs私人,如果你有代理缓存。在您的链接中,我找不到任何建议。大多数CDN建议您缓存这些值。
nicoX

14

对于Apache服务器,应检查mod_expires以设置Expires和Cache-Control标头。

另外,您可以使用Header指令自行添加Cache-Control:

Header set Cache-Control "max-age=290304000, public"

5

meta缓存控制标签允许Web发布者定义缓存应如何处理页面。它们包括用于声明应缓存的内容,可以由缓存存储的内容,修改过期机制以及重新验证和重新加载控件的指令。

允许的值为:

公共-可能被缓存在公共共享缓存中
私有-可能仅被缓存在私有缓存中
无缓存-可能没有缓存
无存储-可能被缓存但未被存档

请注意区分大小写。在您的网页源中添加以下元标记。标签末尾的拼写差异是使用“ /> = xml或”> = html。

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

来源-> MetaTags


更正:不应缓存无存储,不允许缓存任何高速缓存,但是在保留之前必须与服务器进行检查-请参阅palizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse

高速缓存控制的无存储-无存储与无高速缓存类似,因为无法缓存和重新使用响应,但是有一个重要的区别。No-store每次都要求从源服务器请求并下载资源。这是处理私人信息时的重要功能。
MarcoZen

5

OWASP建议以下内容:

尽可能确保将缓存控制HTTP标头设置为no-cache,no-store,must-revalidate,private;并且pragma HTTP标头设置为no-cache。

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.