在这里阅读了很多文章和一些问题后,我终于成功激活了Apache mod_expires,告诉浏览器它必须缓存1年的图像.
<filesMatch "\.(ico|gif|jpg|png)$">
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header append Cache-Control "public"
</filesMatch>
Run Code Online (Sandbox Code Playgroud)
谢天谢地,服务器响应似乎是正确的:
HTTP/1.1 200 OK
Date: Fri, 06 Apr 2012 19:25:30 GMT
Server: Apache
Last-Modified: Tue, 26 Jul 2011 18:50:14 GMT
Accept-Ranges: bytes
Content-Length: 24884
Cache-Control: max-age=31536000, public
Expires: Sat, 06 Apr 2013 19:25:30 GMT
Connection: close
Content-Type: image/jpeg
Run Code Online (Sandbox Code Playgroud)
好吧,我认为这会阻止浏览器下载甚至向服务器询问有关图像的信息,为期1年.但部分原因是:如果您关闭并重新打开浏览器,浏览器不会再从服务器下载图像,但浏览器仍然会向每个图像发送HTTP请求来询问服务器.
如何强制浏览器停止为每个图像发出HTTP请求?即使这些HTTP请求后面没有下载的图像,它们仍然是向服务器发出的请求,这些请求可能会造成延迟,并减慢页面渲染速度!
我已经告诉浏览器它必须将图像保存在缓存中1年!为什么浏览器仍在为每个图像查询服务器(即使它没有下载图像)?!
查看FireBug中的网络图(菜单FireBug> Net> Images)我可以看到不同的缓存行为(我显然开始使用浏览器缓存完全空,我使用"清除所有历史记录"强制在浏览器上删除缓存):
当第一次加载页面时,所有图像都被下载(如果我通过单击浏览器的重新加载页面按钮强制页面重新加载,则会发生同样的事情).这很有道理!
当我浏览网站并返回同一页面时,根本不会下载图像,浏览器甚至不会向服务器询问 …
我怎样才能获得Apache上的静态内容{被浏览器缓存}而不是{检查新鲜度{每次请求}}?
我正在Apache webserver上托管的网站上工作.最近,我正在使用标题(针对不同类型的内容的Content-Type)进行测试,并看到了很多对图像的条件请求.例:
200 /index.php?page=1234&action=list
304 /favicon.ico
304 /img/logo.png
304 /img/arrow.png
(etc.)
Run Code Online (Sandbox Code Playgroud)
虽然图像文件是静态内容并且由浏览器缓存,但每次用户打开链接到它们的页面时,它们都是有条件请求的,它们发送"304 Not Modified".这很好(传输的数据较少),但这意味着每次页面加载会产生20多个请求(由于所有这些往返行程导致页面加载时间更长,即使启用了Keep-Alive和流水线操作).
如何告诉浏览器保留现有文件而不检查更新版本?
编辑:mod_expires方法工作,即使使用favicon.
我在Apache上运行PHP,并对如何实现服务器端缓存感到困惑,以便加快网站加载速度.
是什么之间的区别Expires,Last-Modified以及ETag头,哪一个应该在什么情况下使用?
我想在我的网站上缓存图像和其他文件,所以我做的是确保mod_headers和mod_expires: -
/usr/sbin/httpd -l
Run Code Online (Sandbox Code Playgroud)
然后编辑.htaccess为: -
ExpiresActive On
ExpiresDefault A0
# Set up caching on media files for 1 year (forever?)
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A29030400
Header append Cache-Control "public"
</FilesMatch>
# Set up caching on media files for 1 week
<FilesMatch "\.(gif|jpg|jpeg|png|swf)$">
ExpiresDefault A604800
Header append Cache-Control "public"
</FilesMatch>
# Set up 2 Hour caching on commonly updated files
<FilesMatch "\.(xml|txt|html|js|css)$">
ExpiresDefault A9200
Header append Cache-Control "proxy-revalidate"
</FilesMatch>
# Force no caching for dynamic files
<FilesMatch "\.(php|htm)$">
ExpiresActive Off
Header …Run Code Online (Sandbox Code Playgroud) 我想检查我的服务器中是否启用了mod_headers和mod_expires模块
是否有一种方法可以使用某些php函数列出apache启用/禁用模块,就像我们使用phpinfo()列出php信息一样; 功能?
在Apache的mod_expires模块中,有一个Expires指令有两个基本时间段,访问和修改.
ExpiresByType text/html "access plus 30 days"
Run Code Online (Sandbox Code Playgroud)
可以理解的是,缓存将在30天后请求新鲜内容.
然而,
ExpiresByType text/html "modification plus 2 hours"
Run Code Online (Sandbox Code Playgroud)
没有直觉意义.
除非向服务器发出请求,否则浏览器缓存如何知道文件已被修改?如果它正在调用服务器,缓存此指令有什么用?在我看来,我不理解缓存的一些关键部分.请赐教.
我正在尝试使用Apache的.htaccess文件缓存一些文件.我想缓存一个特定的文件夹比其他任何东西都长,所以我一直在尝试使用FilesMatch指令,如下所示:
<FilesMatch "skins(.*)\.(jpg|png|gif)">
ExpiresDefault A2592000
</FilesMatch>
我希望能够将所有图像文件缓存在/ skins /目录及其子目录中.但是,我无法完全使用正则表达式--Aracle只是完全忽略它.
如何匹配<FilesMatch>.htaccess文件中的文件夹?
干杯,
马特
我有XAMPP,我可以在路径下看到mod_expires.so文件
... XAMPP\apache的\模块\ mod_expires.so
但是,我认为该模块没有加载有两个原因:
第一:调用phpinfo()时未列出mod_expires
第二,是我将缓存时间线添加到.htaccess文件中我得到500服务器错误
(.htaccess中的缓存代码示例
<IfModule mod_expires.c>
# Activate mod_expires for this directory
ExpiresActive on
#HTML documents are good for a week from the time they were changed
ExpiresDefault M604800
</IfModule>
Run Code Online (Sandbox Code Playgroud)
两个问题那么:
是否存在指示模块已安装的mod_expires.so文件?
如果是,我该如何启用或激活?
如果不是,我如何在XAMPP中安装和启用?
谢谢,
我想使用apache中的mod_expires模块设置cache-headers.我的配置看起来像这样:
<LocationMatch ^/static >
ExpiresDefault "access plus 1 years"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
问题是,文件是由我无法控制的第三个系统生成的.这些系统提供带有以下标题的文件:
Date Mon, 24 Oct 2011 08:39:02 GMT
Cache-Control no-cache,no-store,must-revalidate
Pragma no-cache
Expires Thu, 01 Dec 1994 16:00:00 GMT
Run Code Online (Sandbox Code Playgroud)
这些标头使得无法使用mod_expires设置缓存标头.http://httpd.apache.org/docs/2.2/mod/mod_expires.html告诉我们原因:
当Expires标头已经是服务器生成的响应的一部分时,例如,当由CGI脚本生成或从源服务器代理时,此模块不会更改或添加Expires或Cache-Control标头.
是否有任何可能的方法来规避此规则并使用mod_expires覆盖标头?
更新: 一种可能的解决方案是,为了避免此限制,仅使用mod_headers来设置缓存标头.不幸的是,这不是一个替代方案,因为必须计算这些值.
谢谢它提前.
我有一些内容永远不会改变的目录.
是否可以创建.htaccess文件,告诉浏览器该目录和子目录中的任何内容都可以缓存很长时间?
如果可能的话,我想在每个目录中复制相同的.htaccess文件.
如果这是可能的,你会建议max-age超过期限或两者兼而有之吗?
mod-expires ×10
apache ×7
caching ×3
.htaccess ×2
browser ×2
mod-headers ×2
apache2 ×1
etag ×1
http-headers ×1
php ×1
phpinfo ×1
regex ×1
xampp ×1