2012-08-23 45 views
2

我使用Chrome来审核我的网站,并且我发现.js和.css文件没有被缓存,尽管我已将.htaccess文件设置为这样做。无法将缓存控件公开设置为.js,.css和图像文件

我删除了从我的网站的根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文件和图像文件的代码不工作?

+0

“你可以看到这段代码无法正常工作”:D ...无论如何,至少它是否正常DEFLATE? – Ryan

+0

另外,你为什么禁用ETags? – Ryan

+0

它似乎正在放气,只是没有缓存。关于ETags我读过它对性能有好处。这是一个坏主意吗? – lisovaccaro

回答

0

在写作的那一刻起,你正在运行的服务器生成头这样对JavaScript:

Expires: access plus 1 day 

这是不正确,应该被替换为有效日期和时间。所以它解释了浏览器不能正确缓存资源。按照documentation,没有理由不起作用。

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

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

+0

@ Liso22谢谢你的赏金。我很想知道你的Apache2配置文件有什么问题,你怎么修复它? –

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" 

我认为这应该工作。

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 
0

在您的配置文件修改:

Header set Cache-Control "public" 

看起来像

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

因此,您的文件至少缓存一年(最大年龄以秒为单位)。

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

此外,看看这个page,它提供了一些在mod_expires模块的见解。

相关问题