以下是 .htaccess 文件的摘要:
# ------------------------------------------------------------------------------
# | ETag removal |
# ------------------------------------------------------------------------------
# Since we're sending far-future expires headers (see below), ETags can
# be removed: http://developer.yahoo.com/performance/rules.html#etags.
# `FileETag None` is not enough for every server.
<IfModule mod_headers.c>
Header unset ETag
<filesMatch "\.(ico|jpe?g|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, public"
</filesMatch>
<filesMatch "\.(x?html?|php)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</filesMatch>
</IfModule>
FileETag None
# ------------------------------------------------------------------------------
# | Expires headers (for better cache control) |
# ------------------------------------------------------------------------------
# The following expires headers are set pretty far in the future. If you don't
# control versioning with filename-based cache busting, consider lowering the
# cache time for resources like CSS and JS to something like 1 week.
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Data interchange
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (cannot be renamed!)
ExpiresByType image/x-icon "access plus 1 week"
# HTML components (HTCs)
ExpiresByType text/x-component "access plus 1 month"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType text/javascript "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType application/x-javascript "access plus 1 year"
# Manifest files
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Media
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# Web feeds
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# Web fonts
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
</IfModule>
可以看出,我在适当的语法中有Cache-Control和Expires。然而谷歌PageSpeed工具说我的JS没有利用浏览器缓存。有什么我想要添加的吗?
我理解同时包含Cache-Control和Expires Headers并不是一个好习惯。所以我删除了Cache-Control部分。本地文件(目前不关心第三方外部)在通过Google时仍然显示为未缓存。需要缓存的文件是http://www.peppyburro.com/sandboxassets/js/burroinline.js。有问题的 .htaccess 位于文档根目录,即http://www.peppyburro.com/.htaccess。带有上述缓存片段的 .htaccess 也位于包含 burroinline.js 的 / js 文件夹中。
为了增加混淆,https://www.giftofspeed.com/cache-checker/说我的文件按预期缓存,而Google PageSpeed和GTMetrix表示不是。
更新:看起来我的CDN(CloudFlare)与缓存问题有关,因为一旦我禁用了CF,缓存类就开始工作了。我说的有点因为Google PageSpeed在缓存和非缓存之间随机交替,尽管我的htaccess没有任何变化!此外,GTMetrix仍然将文件显示为未缓存。这是我的浏览器上标题的样子:
**General**
Request URL:http://peppyburro.com/sandboxassets/js/burroinline.js
Request Method:GET
Status Code:200 OK (from disk cache)
Remote Address:209.99.16.94:80
**Response Headers**
Accept-Ranges:bytes
Access-Control-Allow-Origin:*
Age:0
Cache-Control:max-age=216000, public
Content-Encoding:gzip
Content-Length:38611
Content-Type:application/javascript
Date:Wed, 01 Mar 2017 16:22:41 GMT
Expires:Thu, 01 Mar 2018 16:22:41 GMT
Last-Modified:Wed, 01 Mar 2017 02:18:53 GMT
Server:Apache Phusion_Passenger/4.0.10 mod_bwlimited/1.4 mod_fcgid/2.3.9
Vary:Accept-Encoding,User-Agent
Via:1.1 varnish-v4
X-Varnish:31524632
这是否意味着文件实际上已缓存?如果是这样,那么在Google PageSpeed和GTMetrix中可以采取哪些措施来保持一致?我怎样才能使CF启用?
PS :在共享主机上,我无法访问 httpd.conf 。
答案 0 :(得分:1)
编辑:答案最终是CloudFlare和.htaccess文件之间的冲突。本文的评论讨论了此问题的故障排除和解决方法。
我通过pingdom的工具运行此资源,以查看请求/响应的样子。
https://tools.pingdom.com/#!/d8QPQx/http://www.peppyburro.com/sandboxassets/js/burroinline.js
实际上它并没有被缓存。标头设置为no-cache。
&#34;无缓存&#34;表示返回的响应不能用于 在没有首先检查的情况下满足对相同URL的后续请求 如果响应已更改,则使用服务器。结果,如果适当的话 验证令牌(ETag)存在,no-cache导致往返 验证缓存的响应,但如果可以消除下载 资源没有改变。
服务器的响应是:
Cache-Control public, max-age=216000
因为它是javascript,所以建议将其延长到一周或更长时间。此外,此处的回复是公开的,而您的设置是
Header set Cache-Control "max-age=216000, private"
年龄是正确的,但能见度是一个悬殊。
&#34;公共&#34;与&#34;私人&#34;
如果响应被标记为&#34; public&#34;,那么即使它被缓存也可以缓存 它具有与之关联的HTTP身份验证,即使是 响应状态代码通常不可缓存。大多数时候, &#34;公共&#34;没有必要,因为显式的缓存信息(如 &#34; max-age&#34;)表示响应无论如何都是可缓存的。
相比之下,浏览器可以缓存&#34;私有&#34;响应。但是,这些 响应通常用于单个用户,因此是中间用户 缓存不允许缓存它们。例如,用户的浏览器可以 使用私有用户信息缓存HTML页面,但CDN不能 缓存页面。
我也看到了一些cloudflare(CDN)标头,标志着它没有被缓存。通常,私人回复适用于敏感内容。我首先尝试将其设置为公开,但前提是您不关心敏感信息。
如果您关注敏感信息将此信息保密为。
虽然我认为这可能是问题,但还有其他一些因素(以CDN为中心)也可能导致问题。
Accept-Ranges:bytes
Access-Control-Allow-Origin:*
Age:0
Cache-Control:public, max-age=216000
CF-Cache-Status:MISS
CF-RAY:338d062cb1035a6e-BOS
Connection:Keep-Alive
Content-Type:application/javascript
Date:Wed, 01 Mar 2017 15:07:08 GMT
Expires:Sat, 04 Mar 2017 03:07:08 GMT
Last-Modified:Wed, 01 Mar 2017 02:18:53 GMT
Proxy-Connection:Keep-Alive
Server:cloudflare-nginx
Vary:Accept-Encoding
Via:1.1 varnish-v4
X-Varnish:18615326
这些是来自服务器的响应标头。他们包括一个&#34; MISS&#34;在CF(cloudflare)缓存中。此外,此处缓存控制也设置为public。
因此,我认为中间CDN可能会导致缓存问题。
如果您有任何其他信息要提供(例如CDN / CloudFlare信息),我很乐意再看看。