2

我使用 Chrome 来审核我的网站,我发现 .js 和 .css 文件没有被缓存,尽管我已经设置了我的 .htaccess 文件来这样做。

我从站点的根 htaccess 文件中删除了除下面的代码之外的所有内容,但我仍然在 Chrome 中收到消息“以下资源明确不可缓存。如果可能,请考虑使它们可缓存”,指示我的主要外部 .js 和 .css 文件没有被缓存。这些文件和图像占总下载大小的 90%,所以无法缓存它们让我发疯。

这是目前我的 .htaccess 文件的代码。完全像这样仍然不会缓存任何东西。

# Disable Etags
Header unset ETag
FileETag None

# Expires
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header unset Last-Modified
Header set Cache-Control "public"

<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi|html?)$">
Header set Cache-Control "private, must-revalidate, proxy-revalidate"
ExpiresDefault A0
ExpiresActive Off
</FilesMatch>

# Enable Compresion
<FilesMatch ".(js|css|html|htm|php|xml)$">
SetOutputFilter DEFLATE
</FilesMatch>

您可以在http://lujanventas.com看到此代码不起作用

如何将缓存控制公开设置为 .css、.js 和图像文件?

4

4 回答 4

3

我不是缓存控制和过期标头方面的专家,但我总是使用此代码并且它总是有效(我不太确定这是否是您正在寻找的但我还是发布了它,看看它是否适合您或不是) :

#################
# CACHE HEADERS #
#################
## BEGIN Expire headers
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 7200 seconds"
    ExpiresDefault "access plus 1 seconds"
    ExpiresByType image/jpg "access plus 2592000 seconds"
    ExpiresByType image/jpeg "access plus 2592000 seconds"
    ExpiresByType image/png "access plus 2592000 seconds"
    ExpiresByType image/gif "access plus 2592000 seconds"
    AddType image/x-icon .ico
    ExpiresByType image/ico "access plus 2592000 seconds"
    ExpiresByType image/icon "access plus 2592000 seconds"
    ExpiresByType image/x-icon "access plus 2592000 seconds"
    ExpiresByType text/css "access plus 2592000 seconds"
    ExpiresByType text/javascript "access plus 2592000 seconds"
    ExpiresByType text/html "access plus 7200 seconds"
    ExpiresByType text/html "access plus 1 seconds"
    ExpiresByType application/xhtml+xml "access plus 7200 seconds"
    ExpiresByType application/xhtml+xml "access plus 1 seconds"
    ExpiresByType application/javascript "access plus 2592000 seconds"
    ExpiresByType application/x-javascript "access plus 2592000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
</IfModule>
## END Expire headers
#################
# CACHE CONTROL #
#################
## BEGIN Cache-Control Headers
<IfModule mod_headers.c>
    <FilesMatch "\\.(ico|jpe?g|png|gif|swf|gz|ttf)$">
        Header set Cache-Control "max-age=2592000, public"
    </FilesMatch>
    <FilesMatch "\\.(css)$">
        Header set Cache-Control "max-age=2592000, public"
    </FilesMatch>
    <FilesMatch "\\.(js)$">
        Header set Cache-Control "max-age=2592000, private"
    </FilesMatch>
    <filesMatch "\\.(html|htm)$">
        Header set Cache-Control "max-age=7200, public"
        Header set Cache-Control "max-age=1, public"
    </filesMatch>
    # Disable caching for scripts and other dynamic files
    <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
        Header unset Cache-Control
    </FilesMatch>
</IfModule>
## END Cache-Control Headers
########
# ETAG #
########
## KILL THEM ETAGS
Header unset ETag
FileETag none
于 2012-08-29T12:45:46.773 回答
1

在撰写本文时,您正在运行的服务器以这种方式为 JavaScript 生成标头:

Expires: access plus 1 day

这是不正确的,它应该被替换为生效日期和时间。所以它解释了没有浏览器能够正确缓存资源。

根据文档,它没有理由不起作用。

您的配置中是否有任何隐藏字符阻止 Apache2 正确解析该行?尝试删除该行ExpiresDefault并在可靠的文本编辑器中从头开始重新键入。

如果仍然失败,您的 Apache2 版本/二进制文件来自哪里?

于 2012-08-31T12:00:51.577 回答
1
ExpiresActive On
ExpiresDefault A0

# 1 Week expire
<filesMatch "\.(gif|jpg|jpeg|png|swf|css|js)$">
ExpiresDefault A604800
Header append Cache-Control "public"
</filesMatch>

#No caching
<filesMatch "\.(pl|php|cgi|spl|scgi|fcgi|html)$">
ExpiresActive Off
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"

我相信这应该有效。

于 2012-08-29T09:20:52.907 回答
0

在您的配置文件中修改:

Header set Cache-Control "public"

看起来像

Header set Cache-Control "public max-age=31536000"

因此,您的文件至少会缓存一年(max-age 以秒为单位)。

为什么?我加载了你的页面两次,我看到请求发送了一个max-age=0

另外,请查看此页面,它提供了有关 mod_expires 模块的一些见解。

于 2012-08-29T17:11:22.273 回答