无法将缓存控制公共设置为.js,.css和图像文件

时间:2012-08-23 04:55:44

标签: .htaccess

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

我删除了我网站的root htaccess文件中的所有内容,但下面的代码除外,我仍然收到消息“以下资源明确是不可缓存的。如果可能的话,考虑让它们可缓存”,表示我的主要外部.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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"

我相信这应该有用。

答案 2 :(得分:1)

在撰写本文时,您运行的服务器会为JavaScript生成标题:

Expires: access plus 1 day

这是不正确的,它应该被有效的日期和时间所取代。因此,它解释了没有浏览器能够正确缓存资源。

根据documentation,没有理由说它不起作用。

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

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

答案 3 :(得分:0)

在配置文件中修改:

Header set Cache-Control "public"

看起来像

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

所以你的文件缓存至少一年(max-age以秒为单位)。

为什么呢?我加载了两次页面,然后我看到请求发送了max-age=0

另外,请查看此page,它会在mod_expires模块中提供一些见解。