百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 网站模板(百分百源码网)>电脑软件>服务器> Etag和Expires 机能调优
分享本文到:

Etag和Expires 机能调优

发布时间:05/16 来源:未知 浏览: 关键词:
1、Etag和Expires中Client 端Http Request Header及Server端Http Reponse Header工作道理。
2、静态下Apache、Lighttpd和Nginx中Etag和Expires配置
3、非实时交互动态页面中Etag和Expires处置
在客户端通过阅读器发出第一次请求某一个URL时,依据 HTTP 协定的规定,阅读器会向服务器传送报头(Http Request Header),服务器端相应同时记载相干属性标志(Http Reponse Header),服务器端的返回状态会是200,格局相似如下:
HTTP/1.1 200 OK
Date: Tue, 03 Mar 2009 04:58:40 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000

Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″

客户端第二次请求此URL时,依据 HTTP 协定的规定,阅读器会向服务器传送报头(Http Request Header),服务器端相应并记载相干记载属性标志文件没有产生改动,服务器端返回304,直接从缓存中读取:
HTTP/1.x 304 Not Modified
Date: Tue, 03 Mar 2009 05:03:56 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000
Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″
其中Last-Modified、Expires和Etag是标志页面缓存标识

一、Last-Modified、Expires和Etag相干工作道理
1、Last-Modified
在阅读器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标志(Http Reponse Header)此文件在服务期端最后被修改的工夫,格局相似这样:
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
客户端第二次请求此URL时,依据 HTTP 协定的规定,阅读器会向服务器传送 If-Modified-Since 报头(Http Request Header),扣问该工夫之后文件是否有被修改正:
If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT
要是服务器端的资源没有变化,则主动返回 HTTP 304 (NotChanged.)状态码,内容为空,这样就节俭了传输数据量。当服务器端代码产生转变或者重新启动服务器时,则从新发出资源,返回和第一次请求时相似。从而保证不向客户端反复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
注:要是If-Modified-Since的工夫比服务器目前工夫(目前的请求工夫request_time)还晚,会以为是个非法请求

2、Etag工作道理
HTTP 协定规格注明定义ETag为"被请求变量的实体标志" (参见14.19)。简略点即服务器相应时给请求URL标志,并在HTTP相应头中将其传送到客户端,相似服务器端返回的格局:
Etag: "5d8c72a5edda8d6a:3239″
客户端的查询更新格局是这样的:
If-None-Match: "5d8c72a5edda8d6a:3239″
要是ETag没转变,则返回状态304。
即:在客户端发出请求后,Http Reponse Header中包含 Etag: "5d8c72a5edda8d6a:3239″
标识,等于告诉Client端,你拿到的这个的资源有表示ID:5d8c72a5edda8d6a:3239。当下次需要发Request索要统一个URI的时候,阅读器同时发出一个If-None-Match报头( Http RequestHeader)此时包头中信息包含上次访问得到的Etag: "5d8c72a5edda8d6a:3239″标识。
If-None-Match: "5d8c72a5edda8d6a:3239"
,这样,Client端等于Cache了两份,服务器端就会比对2者的etag。要是If-None-Match为False,不返回200,返回304 (Not Modified) Response。

3、Expires
给出的日期/工夫后,被相应以为是过时。如Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和Last-Modified联合运用。用于控制请求文件的有效工夫,当请求数据在有效期内时客户端阅读器从缓存请求数据而不是服务器端. 当缓存中数据失效或逾期,才决议从服务器更新数据。

4、Last-Modified和Expires
Last-Modified标识能够节俭一点带宽,但是还是逃不掉发一个HTTP请求出去,而且要和Expires一起用。而Expires标识却使得阅读器干脆连HTTP请求都不用发,比方当会员F5或者点击Refresh按钮的时候就算关于有Expires的URI,同样也会发一个HTTP请求出去,所以,Last-Modified还是要用的,而 且要和Expires一起用。

5、Etag和Expires
要是服务器端同时设置了Etag和Expires时,Etag道理一样,即与Last-Modified/Etag对应的HttpRequest Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和WebServer发出的Last-Modified,Etag值完全同样;在完全匹配If-Modified-Since和If-None-Match即检查完修改工夫和Etag之后,服务器才能返回304.

6、Last-Modified和Etag
Last-Modified 和ETags请求的http报头一起运用,服务器首先发生 Last-Modified/Etag标志,服务器可在稍后运用它来判断页面是否已经被修改,来决议文件是否继续缓存
历程如下:
1. 客户端请求一个页面(A)。
2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
3. 客户端展示该页面,并将页面连同Last-Modified/ETag一起缓存。
4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起通报给服务器。
5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回相应304和一个空的相应体。
注:
1、Last-Modified和Etag头都是由Web Server发出的Http Reponse Header,Web Server应当同时支撑这两种头。
2、Web Server发送完Last-Modified/Etag头给客户端后,客户端会缓存这些头;
3、客户端再次发起雷同页面的请求时,将离别发送与Last-Modified/Etag对应的Http RequestHeader:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和WebServer发出的Last-Modified,Etag值完全同样;
4、通过上述值到服务器端检查,判断文件是否继续缓存;

二、Apache、Lighttpd和Nginx中针配置Etag和Expires,有效缓存纯静态如css/js/pic/页面/流媒体等文件。
A、Expires
A.1、Apache Etag
运用Apache的mod_expires 模块来设置,这包括控制应对时的Expires头内容和Cache-Control头的max-age指令
ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/html "access plus 30 minutes"
ExpiresByType text/css  "access plus 30 minutes"
ExpiresByType text/txt  "access plus 30 minutes"
ExpiresByType text/js   "access plus 30 minutes"
ExpiresByType application/x-javascript   "access plus 30 minutes"
ExpiresByType application/x-shockwave-flash     "access plus 30 minutes"

<ifmodule mod_expires.c>
<filesmatch "\.(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 year"
</filesmatch>
</ifmodule>
当设置了expires后,会主动输出Cache-Control 的max-age 信息
具体对于 Expires 细致内容可以查看Apache官方文档。
在这个工夫段里,该文件的请求都将直接通过缓存服务器获取,
当然要是需要忽略阅读器的刷新请求(F5),缓存服务器squid还需要运用 refresh_pattern 选项来忽略该请求
refresh_pattern -i \.gif$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpeg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.png$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.bmp$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.htm$ 60 100% 100 ignore-reload
refresh_pattern -i \.html$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.xml$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.txt$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.css$ 1440 50% 28800 reload-into-ims
refresh_pattern -i \.js$ 60 50% 100 reload-into-ims
refresh_pattern . 10 50% 60
有关Squid中Expires的注明,请参考Squid官方中refresh_pattern介绍。

A.2、Lighttpd Expires
和Apache同样Lighttpd设置expire也要先查看是否支撑了mod_expire模块,
下面的设置是让URI中所有images目录下的文件1小时后逾期;
expire.url = ( "/images/" => "access 1 hours" )
下面是让作用于images目录及其子目录的文件;
$HTTP["url"] =~ "^/images/" {
expire.url = ( "" => "access 1 hours" )
}
也可以指定文件的类型;
$HTTP["url"] =~ "\.(jpg|gif|png|css|js)$" {
expire.url = ( "" => "access 1 hours" )
}
具体参考Lighttpd官方Expires解释

A.3、Nginx中Expires
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
这类文件并不常修改,通过 expires 指令来控制其在阅读器的缓存,以减少无须要的请求。 expires 指令可以控制 HTTP 应对中的" Expires "和" Cache-Control "的头标(起到控制页面缓存的作用)。其他请参考Nginx中Expires

B.1、Apache中Etag设置
在Apache中设置Etag的支撑比较简略,只用在含有静态文件的目录中创立一个文件.htaccess, 里面参加:
FileETag MTime Size
这样就行了,细致的可以参考Apache的FileEtag文档页

B.2、Lighttpd Etag
在Lighttpd中设置Etag支撑:
etag.use-inode: 是否运用inode作为Etag
etag.use-mtime: 是否运用文件修改工夫作为Etag
etag.use-size: 是否运用文件大小作为Etag
static-file.etags: 是否启用Etag的功能
第四个参数确定是要enable的, 前面三个就看现实的需要来选吧,举荐运用修改工夫

B.3、 Nginx Etag
Nginx中默许没有增加对Etag标识.Igor Sysoev的观念"在对静态文件处置上看不出怎样Etag好于Last-Modified标识。"
Note:
Yes, it's addition,and it's easy to add, however, I do not see howETag is better than Last-Modified for static files. -Igor Sysoev
A nice short description is here:
http://www.baidow.com/tupian/lupian/20190516/z0lv2y50nun looks to me that it makes some caches out there to cache theresponse from the origin server more reliable as in rfc2616(ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt) is written.
3.11 Entity Tags 13.3.2 Entity Tag Cache Validators 14.19 ETag
当然也有第三方nginx-static-etags 模块了,请参考
http://mikewest.org/2008/11/generating-etags-for-static-content-using-nginx

三、关于非实时交互动态页面中Epires和Etag处置
对数据更新并不频繁、如tag分类归档等等,可以考虑对其cache。简略点就是在非实时交互的动态程序中输出expires和etag标识,让其缓存。但需要注意关闭session,防止http response时http header包含session id标识;
3.1、Expires
如expires.php
<?php
header('Cache-Control: max-age=86400,must-revalidate');
header('Last-Modified: ' .gmdate('D, d M Y H:i:s') . ' GMT' );
header("Expires: " .gmdate ('D, d M Y H:i:s', time() + '86400′ ). ' GMT');
?>
以上信息表示该文件自请求后24小时后逾期。
其他需要处置的动态页面直接调用即可。
3.2、Etag
依据Http返回状态来处置。当返回304直接从缓存中读取
如etag.php
<?php
cache();
echo date("Y-m-d H:i:s");
function cache()
{
$etag = "//www.jb51.net";
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
header('Etag:'.$etag,true,304);
exit;
}
else header('Etag:'.$etag);
}
?>

我们晓得合理配置etag能节俭不少带宽。
事实上,配置etag缓存并没有配置Last-Modified header 结果好。
当我们并不晓得修改工夫,Etag对动态内容还是比较有用。

手机之家高春辉对于etag补充:
几个不一样或者需要补充的地方:
1、“当然,Etag 对多数站点机能的影响并不是很大。”应当说 Etag 在准确运用的状况下,会让大量的请求以 304 头方式相应,可以相当的节俭服务器资源和带宽。以前一些地方写的不要运用 Etag,是基于有些 webserver 的 Etag 的盘算要领中包含了 inode,这在多台web服务器的状况不可采纳的,而转变这个盘算要领就可以了。
2、关于尽早刷新这点,PHP 险些是做不到的。即便你施行了 flush 以及相似的函数,也要等到请求完全施行之后,才会输出给阅读器端。
3、AJAX 运用 GET 和 POST 各有益处,GET 方式可以更快相应,但是可能会有被阅读器缓存的题目,个别都需要加个随机数来以免,POST 方式则不会。所以最佳是依据本人的状况离别运用 GET 和 POST 要领。 热门标签:dede模板 / destoon模板 / dedecms模版 / 织梦模板
责任编辑:R0ad1
打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有154人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助



订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板