动态内容的PHP标头过期

动态内容的PHP标头过期,php,header,Php,Header,通过使用以下命令,我的资源文件将被缓存到2014年4月15日 header('Expires: Thu, 15 Apr 2014 20:00:00 GMT'); 如果任何资源文件在到期日之前发生更改,如何处理这种情况?您无法告诉客户端其缓存副本不再有效,因为在该日期之前,客户端甚至不需要再次从服务器请求此URL 如果确实需要,您可以做的是更改资源的URL,例如重命名文件、更改数据库ID等等。当然,您还必须更新指向资源的任何链接。当客户端遇到一个修改过的链接时,它将看到一个它没有缓存的URL,因

通过使用以下命令,我的资源文件将被缓存到2014年4月15日

header('Expires: Thu, 15 Apr 2014 20:00:00 GMT');

如果任何资源文件在到期日之前发生更改,如何处理这种情况?

您无法告诉客户端其缓存副本不再有效,因为在该日期之前,客户端甚至不需要再次从服务器请求此URL

如果确实需要,您可以做的是更改资源的URL,例如重命名文件、更改数据库ID等等。当然,您还必须更新指向资源的任何链接。当客户端遇到一个修改过的链接时,它将看到一个它没有缓存的URL,因此它必须从服务器请求它。(如果有人可能仍然试图访问旧URL,您应该安排它返回指向新URL的301移动永久响应。)


除非您确定资源在该日期之前不会再次更改(或者至少客户端不需要看到任何将来的更改),否则应该停止发送far future Expires标头。如果您试图避免客户端重复下载大型资源,则可以改为发送ETag和/或上次修改的头。这些允许客户端在不匹配和/或在以后的请求中修改后使用,因此,如果资源没有更改,则可以发送304 Not Modified。这样,您可以让客户端每次都与服务器进行检查,但只有在资源发生更改时才真正下载资源。

您无法告诉客户端其缓存副本不再有效,因为在该日期之前,它甚至不需要再次从服务器请求此URL

如果确实需要,您可以做的是更改资源的URL,例如重命名文件、更改数据库ID等等。当然,您还必须更新指向资源的任何链接。当客户端遇到一个修改过的链接时,它将看到一个它没有缓存的URL,因此它必须从服务器请求它。(如果有人可能仍然试图访问旧URL,您应该安排它返回指向新URL的301移动永久响应。)


除非您确定资源在该日期之前不会再次更改(或者至少客户端不需要看到任何将来的更改),否则应该停止发送far future Expires标头。如果您试图避免客户端重复下载大型资源,则可以改为发送ETag和/或上次修改的头。这些允许客户端在不匹配和/或在以后的请求中修改后使用,因此,如果资源没有更改,则可以发送304 Not Modified。这样,您可以让客户端每次都与服务器进行检查,但只有在资源发生变化时才真正下载资源。

例如,您有一个名为“style.css”的css文件


现在您更改了此css内容,并希望在用户浏览器中刷新此文件

只有您应该向这个css url添加一个字符串,如下所示

<link rel="stylesheet" type="text/css" media="all" href="style.css?1" />

我在这个文件
s的url中添加了“?1”。

然后用户
s浏览器这个url是新的,它会再次获取这个文件

例如,你有一个css文件,它的名字是“style.css”


现在您更改了此css内容,并希望在用户浏览器中刷新此文件

只有您应该向这个css url添加一个字符串,如下所示

<link rel="stylesheet" type="text/css" media="all" href="style.css?1" />

我在这个文件
s的url中添加了“?1”。

然后用户
s浏览器这个url是新的,它将再次获取这个文件

Simple;如果从现在到那时内容可能会更改,请不要发送该标题。感谢回复,但更改的机会很小,在这种情况下,我们不能忽略缓存的优点。@Wyzard的答案是正确的——向URL添加一些内容,如版本id(例如,
?v=1
)和/或使用上次修改的标题是一种方法;如果从现在到那时内容可能会更改,请不要发送该标题。感谢回复,但更改的机会很小,在这种情况下,我们不能忽略缓存的优点。@Wyzard的答案是正确的——向URL添加一些内容,如版本id(例如,
?v=1
)和/或使用上次修改的标题是最好的选择。谢谢你的回答,我将尝试使用以前从未使用过的ETag。谢谢你的回答,我将尝试使用以前从未使用过的ETag。谢谢你的回复。谢谢你的回复。