【问题标题】:caching using .htaccess - one image not caching weirdness使用 .htaccess 缓存 - 一张图片不缓存怪异
【发布时间】:2014-01-23 08:25:22
【问题描述】:

我在一个共享托管的 linux 服务器上,所以我必须使用.htaccess。我正忙于压缩和缓存东西。我实际上有两个问题,但首先是我如何在 .htaccess 文件中设置缓存。

ExpiresActive on
<FilesMatch "\.(bmp|png|ico|gff|jpg|jpeg|gif|gcf)$">
FileETag MTime Size
ExpiresDefault "now plus 60 minutes"
</FilesMatch>

问题 1,所以除了一个 PNG 文件之外,这确实会缓存这些内容。

现在我的大部分文件都是小写的,因为我在 Linux 上,但是一些 PNG 文件已经通过大写扩展名溜走了。

奇怪的是,除了一个名为addon2.PNG 的PNG 文件之外,所有的PNG 文件都进行了缓存。起初我以为是因为这种情况,但我已经检查过,我还有 3 个其他带有大写扩展名的 PNG 文件——Google Page Speed 说这些文件被缓存了。那么有什么想法或者 Google Page Speed 只是 B.S.?

问题 2,由于我的主机搞砸了他们的 Varnish 问题,我很谨慎,我一次添加一些东西来缓存,并等待看看我的东西是否搞砸了.当我尝试缓存 HTML 文件时,我网站的登录/注销功能(用 PHP 编写)不起作用。

您必须登录并刷新或注销并刷新。我想知道是因为页面 HTML 是通过 PHP 文件输出的吗?我所有的主要页面都是 PHP,我只有几个实际的 html 文件。但我认为缓存 HTML 只会使用下面的代码处理带有 htm 和 html 扩展名的文件。但这有点像服务器试图缓存 PHP 文件输出的 html。我是不是疯了?

ExpiresActive on
ExpiresDefault "now plus 60 minutes"
ExpiresByType text/html "now plus 60 minutes"
<FilesMatch "\.(css|bmp|png|ico|htm|gff|html|jpg|jpeg|gif|gcf)$">
FileETag MTime Size
ExpiresDefault "now plus 60 minutes"
</FilesMatch>

【问题讨论】:

  • 为图像提供请求和响应标头。
  • 不幸的是,我没有 cmd 行访问权限,所以使用嗅探器 GET /images/addon2.PNG HTTP/1.1 主机:ksa-codesphere.com 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0 Referer: rexswain.com/httpview.html Connection: close 接收头: HTTP/1.1·200·OK(CR)(LF) 日期:·Mon,·06·Jan·2014·01:43: 40·GMT(CR)(LF) 服务器:·Apache/2(CR)(LF) 最后修改时间:·Sun,·05·Jan·2014·03:21:40·GMT(CR)(LF) ETag: ·"303a685-968b-4ef30a449a0ce"(CR)(LF) Accept-Ranges:·bytes(CR)(LF) Content-Length:·38539(CR)(LF) Connection:·close(CR)(LF) Content-类型:·图片/png(CR)(LF) (CR)(LF)
  • hmmmm 我用另一个嗅探器检查结果,当我得到那个图像时它说没有缓存
  • firefox 请求标头直接转到图像而不是页面 hmmm max-age=0 奇怪的 User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox /19.0Referer:ksa-codesphere.com/…, 05 Jan 2014 03:21:40 GMTHost:www.ksa-codesphere.comDNT:1Connection:keep-aliveCache-Control:max-age=0Accept-Language:en-US,en;q= 0.5Accept-Encoding:gzip, deflateAccept:image/png,image/*;q=0.8,/;q=0.5 ff 响应服务器:Apache/2Etag:"303a685-968b-4ef30a449a0ce"日期: 2014 年 1 月 6 日星期一 01:53:54 GMTConnection:close 猜测

标签: php html .htaccess caching


【解决方案1】:

您的长解释基本上归结为 PNG 图像没有被缓存并且 HTML 没有刷新。您说的有问题的 PNG 图像(addon2.PNG)可能只是损坏了。但是你的问题是你没有提供任何标题来显示输出是什么。

如果您使用的是 Linux,只需转到终端并使用 curl 获取标头。例如,这就是我如何在他们的主页上获取带有主要Google 图像的标题:

curl -I https://www.google.com/images/srpr/logo11w.png

该命令的输出是:

HTTP/1.1 200 OK
Content-Type: image/png
Last-Modified: Wed, 09 Oct 2013 01:35:39 GMT
Date: Tue, 17 Dec 2013 23:39:21 GMT
Expires: Wed, 17 Dec 2014 23:39:21 GMT
X-Content-Type-Options: nosniff
Server: sffe
Content-Length: 14022
X-XSS-Protection: 1; mode=block
Cache-Control: public, max-age=31536000
Age: 1647616
Alternate-Protocol: 443:quic

因此,在您的情况下,只需输入此命令——记得将其设置为图像的真实路径——如下所示:

curl -I https://url/to/your/site/addon2.PNG

并将标头与您知道的正在缓存的内容进行比较。

另外,ExpiresDefaultCache-Control 有时可能会相互冲突。因此,请检查这两个值以查看您的主机设置的内容与您的 .htaccess 设置的内容。

关于这个:

那么有什么想法或者 Google Page Speed 只是 B.S.?

所有这些页面基准测试工具都有不同的用途。一般来说,对于您面临的具体问题,他们不是 B.S.但完全没用。就像你在一辆漏油的车里,车里的一些自动系统告诉你换油。你不需要“换油”,你需要找到泄漏点并堵住它,这样油就可以留在里面!

因此,在您的情况下,最好的选择是使用像 curl 这样的 Unix 工具来检查标头输出是什么并调整/调整直到正确为止。

编辑另外,请查看这个非常深入且有用的caching guide from Google

【讨论】:

  • 是的,我不打算按照他们说的去做,而且对于一个拥有数千张图片的网站来说,一个 png 文件对我来说并不是什么大问题,但这是一件奇怪的事情不要离开我的脑袋哈哈。 html的东西,但是我真的很想弄清楚
  • 哦想补充一点,我使用的登录 php 文件没有使用我拥有并想要缓存的少数 html 文件
  • 以防万一有人遇到与 htm/html 缓存类似的问题。问题是在我的 .htaccess 文件中我有这两行 ExpiresByType text/html "now plus 60 minutes" 所以它不仅查看扩展名,还查看文件类型,我的 php 文件返回 text/html 的类型。所以它试图缓存我不想要的php。感谢那些告诉我查看 img 上的 http 标头的人,它促使我查看我的 php 文件上的标头。我会关闭这个,但还不能回答自己
  • 嗨@ArtemisJones,很高兴能帮上忙!很高兴您了解并欣赏curl -I 的工作原理。许多 Web 开发人员/管理员对此感到困惑,我印象深刻的是,您不仅使用了它,而且了解如何使用它来解决您的问题!我预测你会做一些出色的工作!保重。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2018-02-09
  • 2017-08-07
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多