Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)协议中和网页缓存相关的几个字段。前两个用来控制缓存的失效日期,后两个用来验证网页的有效性。要注意的是, HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,使用HTTP/1.0的缓存将忽略Expires和Cache-Control头。我们 这里以Apache2.0服务器为例,只讨论HTTP/1.1协议。
Expires
Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。RFC告诉我们:“由于推断的失效时间也许会降低语义透明度,应该被谨慎使用,同时我们鼓励原始服务器尽可能提供确切的失效时间。”
对于一般的纯静态页面,如html、gif、jpg、css、js,默认安装的Apache服务器,不会在响应头添加这个字段。Firefox浏览 器接受到相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户 端。推测出的时间一般是接受到响应时间后的三天左右。
Apache的expires_module模块可以在Http响应头部自动加上Expires字段。在Apache的httpd.conf文件中进行如下配置:
#启用expires_module模块
LoadModule expires_module modules/mod_expires.so
# 启用有效期控制
ExpiresActive On
# GIF有效期为1个月
ExpiresByType image/gif A2592000
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
#以下的含义类似
ExpiresByType text/css “now plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
对于动态页面,如果在页面内部没有通过函数强制加上Expires,例如header(”Expires: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把Wed, 11 Jan 1984 05:00:00 GMT
作为Expires字段内容,返回给浏览器。即认为动态页面总是失效的。而浏览器仍然会保存已经失效的动态页面。
可以发现Firefox浏览器总是缓存所有页面,不管失效、不失效还是没有声明失效时间。即使缓存中声明了一个网页的实效日期是1970-01- 01 08:00:00,浏览器仍然会发送该文件在缓存中的Last-Modified和ETag字段。 如果在服务器端验证通过,返回304状态,浏览器就还会使用此缓存。
Cache-Control
Cache-Control字段中可以声明多些元素,例如no-cache, must-revalidate, max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个 Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮 助,但是他们并不能用于替代身份验证和加密。
Apache的mod_cern_meta模块允许文件级Http响应头部的控制,同时它也可以配置Cache-Control头(或任何其他头)。响应头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。
其中Cache-Control : max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个 delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字 段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control : max-age和Expires值就是一致的。
如果失效日期Cache-Control : max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。
Last-Modified
Last-Modified和ETag是条件请求(Conditional Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上” ETag”和”If Modify Since”头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP 304(Not Modify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”Last-Modified”。
使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。
一般纯静态页面本身都会有Last-Modified信息,Apache服务器会读取页面文件中的Last-Modified信息,并添加到http响应头部。
对于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,例如header(”Last-Modified: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。
无论是纯静态页面还是动态页面,Firefox浏览器巧妙地按照接受到服务器响应的时间设置缓存页面的Last-Modified,而不是按照http响应头部中的Last-Modified字段。
ETag
既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。
Apache服务器默认情况下,会对所有的静态、动态文件的响应头添加ETag字段。
在Apache的httpd.conf文件中可以通过FileETag指令配置该选项。FileETag指令配置了当文档是基于一个文件时用以创建 Etag(entity tag)响应头的文件的属性。在Apache 1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。 如果一个目录的配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag -INode’那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。
在多台负载平衡的服务器环境下,同一个文件会有不同的etag或者文件修改日期,浏览器每次都会重新下载。设置‘FileETag None’可以使响应头不再包含ETag字段。
常用的设置:
<Location ~ "\.(js|css|png|jpg|gif|bmp|html)$">
ExpiresActive On
ExpiresDefault "access plus 1 hours"
Header set Cache-Control max-age=3600
Header unset Pragma
</Location>
<Location ~ "\.(do|jsp|aspx|asp|php|json|action|ashx|axd|cgi)$">
Header set Cache-Control no-cache,no-store,max-age=0
Header unset Expires
</Location>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/* "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType image/x-icon "now plus 2 hours"
</IfModule>
相关推荐
#### 一、Apache与静态页面缓存 对于Apache服务的静态页面,Last-Modified和Etag两个头部字段尤为关键。Last-Modified字段记录文件最后一次修改的时间,而Etag则基于文件内容生成一个唯一标识符,通常包括文件的...
页面缓存是指将频繁访问的网页内容存储在内存中,当用户请求这些页面时,不再需要重新生成或者从数据库查询数据,而是直接从缓存中读取,从而提高了响应速度。OSCache提供了一套完整的解决方案,包括缓存的创建、...
网页缓存是一种优化Web应用程序性能的技术,通过存储用户访问过的页面内容,当用户再次请求相同页面时,可以从缓存中直接读取,避免了重复的网络传输,从而加快页面加载速度,减少服务器负载。在本文档中,我们将...
1. **Apache安装与配置**:在不同的操作系统(如Linux、Windows、macOS)上安装Apache,以及配置httpd.conf文件以定制服务器的行为,包括端口设置、目录权限和虚拟主机。 2. **模块管理**:Apache通过模块化设计来...
Tomcat缓存主要分为两类:` CoyoteCaching `(连接器缓存)和` JspCaching `(JSP页面缓存)。 - **CoyoteCaching**:主要用于处理静态资源,如HTML、CSS、JavaScript等文件。当一个静态文件被请求时,Tomcat会将其...
在性能优化方面,"Apache中文文档"会讲解如何通过调整并发连接数、预读取(KeepAlive)设置、缓存策略等手段来提升服务器响应速度。此外,文档还会涉及如何利用日志分析工具(如AWStats或Logrotate)来监控服务器...
查询缓存是针对数据库查询结果的缓存,它保存特定查询的数据结果,当下次执行相同查询时,直接从缓存中读取数据,不再执行数据库查询。这种方式需要缓存机制能够识别并匹配相同的查询语句,以便提供正确的缓存内容。...
在Linux中,通常通过包管理器(如apt或yum)安装,并使用`apachectl start`或`systemctl start apache2`来启动服务。 2. **配置文件**:Apache的主要配置文件是`httpd.conf`,它定义了服务器的行为、监听端口、文档...
4. **性能优化**:手册可能会讨论如何调整Apache的启动参数以提高服务器性能,例如最大连接数、KeepAlive设置、缓存机制等。 5. **日志分析**:如何解读Apache的日志文件,以及如何使用工具进行日志分析,以监控...
6. **性能优化**:Apache有多种性能优化策略,如使用MPM(多进程模块)如prefork或worker,设置合适的MaxKeepAliveRequests和KeepAliveTimeout,以及开启缓存模块mod_cache等。 7. **HTTPS与SSL/TLS**:在当前网络...
`mod_expires`可以设置静态资源的过期时间,利用浏览器缓存提高页面加载速度。还有像`mod_proxy`和`mod_cache`这样的模块,可用于负载均衡和内容缓存,进一步提升服务器性能。 错误日志和访问日志对于调试和监控...
- **Apache**:需要确保启用了重写模块(即 `mod_rewrite`),并在`.htaccess`文件或虚拟主机配置文件中设置相应的重写规则。 - **Nginx**:Nginx默认支持伪静态功能,可以在Nginx的配置文件中添加相应的重写规则。 ...
- **页面缓存**:将动态生成的页面转化为静态页面存储在服务器上,用户请求时直接发送静态页面,避免了每次请求都需要执行程序逻辑和数据库查询的过程。 例如,早期的发布系统会在后台将数据与页面模板整合成静态...
- 使用mod_expires和mod_headers设置资源过期策略,提高客户端缓存效率。 - mod_deflate用于压缩响应内容,减少网络传输量。 8. **安全性和SSL**: - 配置HTTPS支持,使用SSL/TLS证书进行加密通信。 - 安全最佳...
下面将对压缩包中的各个文件进行详细解读,以便深入理解Apache服务器的关键概念和功能。 1. **caching.html** - 缓存机制 Apache的缓存功能可以提高网站性能,减少网络延迟。通过缓存静态内容(如图片、CSS和...
在Web开发中,页面缓存是一种优化网站性能的技术,它减少了服务器处理请求的负担和网络传输的数据量,从而提高了用户访问速度。此PDF文档中提到的实现方式是基于JSP和Java的简单缓存机制。 首先,我们看到JSP页面...
4. **Web服务器缓存**:Web服务器如Nginx、Apache等可以缓存静态文件,减少对应用服务器的压力。 5. **客户端浏览器缓存**:浏览器会缓存网页资源,减少对服务器的请求,提高页面加载速度。 **操作系统缓存** - ...
8. **性能优化**:Apache可以通过调整各种配置选项来提高性能,例如预读取(KeepAlive)、多线程(MPM模块)、缓存机制等。 9. **CGI和FastCGI**:Apache支持运行CGI(Common Gateway Interface)脚本,用于执行...
6. **错误处理与日志**:解释如何理解和解析Apache的日志文件,以及如何配置错误页面,为故障排查和服务器维护提供便利。 7. **安全最佳实践**:分享安全相关的建议,如定期更新到最新版本以防止已知漏洞,设置...