我的Apache服务器提供的文件未保存在浏览器缓存中

时间:2016-03-07 08:20:29

标签: apache google-chrome caching

我已经安装并配置了一个带有虚拟主机的Apache服务器,用于提供图像。

当我第二次在浏览器上加载带有图像的页面时(第一次加载页面后图像应该在缓存中),浏览器不会从缓存中获取图像(或文件),并认为它应该。

有什么问题?我正在使用谷歌浏览器,当我从其他服务器加载一些其他网络时,缓存有效,所以我认为我对Apache有一些问题,但我不确定。

非常感谢。

响应是由Dash播放器播放的视频片段。

回复标题:

accept-ranges:bytes
content-length:194431
date:Wed, 09 Mar 2016 07:42:07 GMT
etag:"2f77f-52acd33f8b167"
last-modified:Tue, 02 Feb 2016 17:55:12 GMT
server:Apache/2.4.18 (Unix) OpenSSL/1.0.2e PHP/7.0.2
status:200

这样做之后:

ExpiresActive On

# Set up caching on media files for 1 year (forever?)
<FilesMatch "\.(mp4|m4s)$">
ExpiresDefault "access plus 3600 seconds"
Header set Cache-Control "public"
Header set Content-Type "video/mp4"
Header set Vary "Host"
Header set Access-Control-Allow-Origin "*"
</FilesMatch>

标题是:

accept-ranges:bytes
access-control-allow-origin:*
cache-control:public
content-length:194431
content-type:video/mp4

但它没有保存在缓存上,我的意思是,当我重新加载网络或视频时,它不会从缓存中获取它。

2 个答案:

答案 0 :(得分:0)

您没有包含任何缓存控制标头,告知浏览器缓存资源。该规范尚不清楚如何处理这个问题,但大多数浏览器选择不缓存,除非明确告知。

您需要包含这样的Apache配置(假设您已经包含了mod_expiries模块):

ExpiresActive On

# Set up caching on media files for 1 week
<filesMatch ".([iI][cC][oO]|[gG][iI][fF]|[jJ][pP][gG]|[jJ][pP][eE][gG]|[pP][nN][gG]|[fF][lL][vV]|[pP][dD][fF]|[sS][wW][fF]|[mM][oO][vV]|[mM][pP]3|[wW][mM][vV]|[pP][pP][tT])$">
   ExpiresDefault A604800
   Header append Cache-Control "public"
</filesMatch>

# Set up caching on font files for 6 months
<filesMatch ".([eE][oO][tT]|[tT][tT][fF]|[sS][vV][gG]|[Ww][Oo][Ff][Ff]|[Ww][Oo][Ff][Ff]2)$">
   ExpiresDefault 15552000
   Header append Cache-Control "public"
</filesMatch>

然后会产生这样的标题:

cache-control:max-age=10800, public

如果您想了解更多详情,我已就此发表过博客文章:https://www.tunetheweb.com/performance/http-performance-headers/caching/

答案 1 :(得分:0)

好的,我已经解决了这个问题。

我使用的是https连接,而我使用的证书没有正确的参数(通用名称必须是服务器上编程的网址的名称),服务器的证书必须由某个CA进行身份验证,所以我已颁发CA证书以验证服务器证书。这意味着,如果您使用不安全的https连接,则Chrome不会将文件保存在缓存中。

在更正所有证书后,我已上传谷歌浏览器证书以信任我的网站(配置谷歌浏览器,高级选项,管理https / ssl证书)。之后,我可以将文件保存在缓存中,因为证书使https连接安全(chrome url栏上的绿色锁定)。

这是我的问题,这就是我解决它的方法。

感谢您的回答和时间! ;)