If-Modified-Since 条件请求返回未更改的完整内容。

If-Modified-Since 条件请求返回未更改的完整内容。

我的 php 生成的缩略图文件和组合的 javascript 和 css 文件(都有其到期日期和 cache=public 设置等)有时会返回完整内容,有时它们会从代理缓存加载!

这是 redbot.org 有时给出的评论:

If-Modified-Since 条件请求返回未更改的完整内容。

*HTTP 允许客户端发出条件请求,以查看其持有的副本是否仍然有效。由于此响应具有 Last-Modified 标头,因此客户端应该能够使用 If-Modified-Since 请求标头进行验证。RED 已这样做并发现尽管资源没有发生改变,但它还是发送了完整的响应,表明它不支持 Last-Modified 验证。**


PHP 缩略图生成器标头

header ("Content-type: image/jpeg");
header ("Last-Modified: " . gmdate("D, d M Y H:i:s", time() - 404800000)." GMT");
header ("Expires: " . gmdate("D, d M Y H:i:s", time() + 2419200) . " GMT");
header ("Cache-Control: public, max-age=2419200");

访问控制

<IfModule mod_headers.c>
ExpiresActive On
ExpiresDefault M172800

##### DEFAULT EXPIRES
<FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|xml|pdf|flv)$">
    ExpiresDefault M1209600
    Header set Cache-Control "max-age=1209600, public"
</FilesMatch>

##### DYNAMIC PAGES
<FilesMatch "\\.(php|cgi|pl)$">
    ExpiresDefault M7200
    Header set Cache-Control "public, max-age=7200"
</FilesMatch>

Header unset Pragma
Header unset ETag
Header unset Last-Modified
FileETag None
</IfModule>

更新:新信息:

google SpeedTest 给出了 91/100 的分数,上面写着:并列出了所有文件除了 php 生成的文件具有明确的过期标头设置((仍然返回完整内容!??)它说:

以下资源缺少缓存验证器。未指定缓存验证器的资源无法有效刷新。请指定 Last-Modified 或 ETag 标头以启用以下资源的缓存验证。

答案1

您可以使用 Firebug 并粘贴 HTTP 响应标头吗?我感觉,即使在您的代码中您将缓存控制设置为 Public,Apache 也会覆盖它,因为对于 Php 文件类型,您将 Cache-Control 设置为 private。

您可以做的一件事是从 Apache 配置中删除动态页面的缓存设置。这应该可以解决问题,因为代理不会缓存没有正确标头的响应。

编辑

嗨,Sam,重新回顾你的问题,我找到了问题的答案。以下代码片段似乎存在问题。在你的 Php 输出中,Last-Modified 标头始终会发生变化,当浏览器发送 304 If modified 请求时,它会看到更改,因此会重新请求该内容。

header ("Last-Modified: " . gmdate("D, d M Y H:i:s", time() - 404800000)." GMT");

取消设置内容中的 Last-Modified 和 ETags 以加快网站速度。此网站还提供了一些很好的提示。
http://www.askapache.com/htaccess/apache-speed-last-modified.html

答案2

我在 htaccess 文件中添加了以下代码http://pagespeed.googlelabs.com/在 chrome 中我得到了利用浏览器缓存的问题,现在已经解决了,但现在它给出了指定缓存验证器的错误,该怎么办呢我已经添加了缓存控件,下面是代码

<"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>

<"ifModule mod_expires.c>

  ExpiresActive On

  ExpiresDefault "access plus 1 seconds"

  ExpiresByType text/html "access plus 1 seconds"

  ExpiresByType image/gif "access plus 2592000 seconds"

  ExpiresByType image/jpeg "access plus 2592000 seconds"

  ExpiresByType image/png "access plus 2592000 seconds"

  ExpiresByType text/css "access plus 604800 seconds"

  ExpiresByType application/x-javascript "access plus 216000 seconds"

<"/ifModule>

<"ifModule mod_headers.c>

  <"filesMatch "\\\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">

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

  <"/filesMatch>

  <"filesMatch "\\\\.(css)$">

    Header set Cache-Control "max-age=604800, public"
  <"/filesMatch>
  <"filesMatch "\\\\.(js)$">

    Header set Cache-Control "max-age=216000, private"

  <"/filesMatch>

  <"filesMatch "\\\\.(xml|txt)$">

    Header set Cache-Control "max-age=216000, public, must-revalidate"

  <"/filesMatch>

  <"filesMatch "\\\\.(html|htm|php)$">

    Header set Cache-Control "max-age=1, private, must-revalidate"

  <"/filesMatch>

<"/ifModule>

<"ifModule mod_headers.c>

  Header unset ETag

<"/ifModule>

FileETag None

<"ifModule mod_headers.c>

  Header unset Last-Modified

<"/ifModule>

相关内容