网页中flash数据抓取(PHP/5.2.9指示资源的状态唯一标识(Status-Line))
优采云 发布时间: 2022-02-14 14:32网页中flash数据抓取(PHP/5.2.9指示资源的状态唯一标识(Status-Line))
(状态行)HTTP/1.1 200 OK
日期周四,2009 年 11 月 26 日 13:50:54 GMT
服务器Apache/2.2.11 (Unix)PHP/5.2.9
最后修改时间 2009 年 11 月 26 日星期四 13:50:19 GMT
Etag“8fb8b-14-4794674acdcc0”
接受范围字节
内容长度 20
Keep-Alivetimeout=5,最大值=100
连接保活
内容类型text/html
第一次访问资源时,http返回状态码200,并在header中携带当前资源的一些描述信息,如
Last-Modified //表示最后修改时间
etag// 表示资源的状态唯一标识
Expires// 表示资源在浏览器缓存中的过期时间
然后浏览器会将文件缓存在Cache目录中,同时保存文件的上述信息。
当第二次请求该文件时,浏览器会首先检查该文件是否收录在 Cache 目录中。如果有,并且没有达到Expires设置的时间,也就是文件没有过期,那么浏览器会直接从Cache目录下载文件。在不发送请求的情况下读取文件
如果此时文件已经过期,浏览器会向WebServer发送HTTP请求,并在header中携带当前文件的以下信息
If-Modified-Since Thu, 26 Nov 2009 13:50:19GMT
If-None-Match "8fb8b-14-4794674acdcc0"
即最后一次修改的时间和最后一次请求返回的Etag值发送给服务器。服务器收到这个请求后,首先解析头部信息,然后验证头部信息。
如果文件没有被修改或者Etag信息自上次以来没有改变,服务器会直接返回304状态,而不是返回文件资源。状态头如下
(状态行)HTTP/1.1 304 未修改
日期周四,2009 年 11 月 26 日 14:09:07 GMT
服务器Apache/2.2.11 (Unix) PHP/5.2.9
连接保活
Keep-Alivetimeout=5,最大值=100
Etag“8fb8b-14-4794674acdcc0”
这样可以大大降低网络带宽,提高用户的浏览器体验。
当然,如果服务器匹配后发现文件被修改了,它会返回文件资源和新的文件状态信息。
【基础领域】
编译指示
Pragma 头字段用于收录特定于实现的指令,最常见的是 Pragma:no-cache。在 HTTP/1.1 协议中,其含义与 Cache-Control:no-cache 相同。
过期
本地缓存中文件的过期时间。如果浏览器发现缓存中的文件没有过期,就不会发送请求(也有例外,后面会讲)
缓存控制
Cache -Control 指定请求和响应遵循的缓存机制。
在请求消息或响应消息中设置 Cache-Control 不会修改另一个消息进程中的缓存进程。请求缓存指令包括
无缓存,无存储,最大年龄,最大陈旧,最小新鲜,仅当缓存
响应消息中的说明包括
公共、私有、无缓存、无存储、无转换、必须重新验证、代理重新验证、最大年龄
每条消息中的指令含义如下:
1.Public 表示响应可以被任何缓冲区缓存。
2.Private 表示单个用户的全部或部分响应消息不能被共享缓存处理。这允许服务器只描述用户响应消息的一部分,这对于其他用户的请求是无效的。
3.no-cache 表示请求或响应消息不能被缓存
4.no-store 用于防止重要信息被无意释放。发送请求消息将使请求和响应消息不使用缓存。
5.max-age 表示客户端可以接收到生命周期不大于指定时间(以秒为单位)的响应。
6.min-fresh 表示客户端可以收到响应时间小于当前时间加上指定时间的响应。
7.max-stale 表示客户端可以收到超过超时时间的响应消息。如果您为 max-stale 消息指定一个值,则客户端可以接收超过超时期限中指定的值的响应消息。
Etag/If-None-Match
一对标记为“实体标签”的响应/请求标头,用于验证文件的实体。在Apache中,ETag的值默认通过文件的索引节点(INode)、大小(Size)和最后修改时间(MTime)进行散列得到。
Last-Modified/If-Modified-Since
一对验证文件修改时间的响应/请求头
Expires、Cache-Control、Last-Modified 和 ETag 是 RFC2616(HTTP/1.1) 协议中的网页缓存相关的几个字段。
前两个用于控制缓存的过期日期,浏览器可以通过它来判断是否需要发出HTTP请求;
后两者用于验证网页的有效性,服务器用它来验证文件是否需要再次返回。
Last-ModifiedVS Etag
既然您有 Last-Modified,为什么还要使用 ETag 字段?因为如果您在一秒钟内对文件进行两次更改,Last-Modified 将不正确。因此,HTTP/1.1 使用实体标签标头提供更严格的验证。
【不同情况】
上面的描述是一个普通的浏览器缓存状态。在实际应用中,比如页面跳转(点击页面链接跳转,window.open,地址栏回车,刷新页面)等操作,会有一些区别
正常页面跳转
正常的页面跳转包括链接点击跳转,使用js脚本打开新页面(window.open)
在没有缓存的情况下,请求会返回所有资源结果
设置Expires且未过期时,浏览器不会发出http请求
如果Expires过期,会发送一个对应的请求,带有Last-Modifed等信息,供服务器验证
页面刷新(F5)
这种情况下,你一般会看到很多304请求,即即使资源设置为Expires并且没有过期,浏览器也会发送相应的请求
IE和FF略有不同
IE:
If-Modified-Since 2009 年 11 月 18 日星期三 15:54:52GMT
If-None-Match "2360492659"
Pragma: no-cache // 禁用缓存
法郎:
If-Modified-Since 2009 年 11 月 18 日星期三 15:54:52GMT
If-None-Match "2360492659"
Cache-Control max-age=0// 文件立即过期
强制刷新(Ctrl+F5)
效果和没有缓存的时候一样,返回200的结果。
一些特殊资源
框架
我有一个收录 iframe 框架的主页,iframe 加载一个带有 ajax 操作 json 的页面。第一次打开主页面时,页面在iframe中读取的json数据是最新的。当数据库中的数据被修改,主页面被刷新时,iframe中页面的数据并没有从数据库中获取最新的数据。对于此类问题,FF中的解决方法可以参考IE文章中如何让iframe不缓存,即在页面头部添加如下语句:
但在 IE 中不起作用。解决IE中iFrame缓存问题的方法有两种:
(1) 每次主页面刷新时随机更改iframe的名称;
(2) 每次主页面刷新时,都会给iframe的src路径页面分配一个随机get参数,例如:
闪光
使用以下方法强制不从浏览器的本地缓存中读取 SWF 文件。或强制其 SWF 文件每次读取最新的媒体文件
确保每次都阅读最新的 SWF 文件。
1:使用“Expires”标头这是告诉浏览器不要读取HTML文件中的本地缓存。在中间添加以下代码。在这种情况下,每次访问该文件时,它都会告诉浏览器其缓存版本已过期,将再次从服务器读取。获取最新文件
2:直接告诉浏览器在收录SWF文件的HTML页面中根本没有缓存插入:
IE5 版本不支持不带 Cache 标头,因此微软建议使用带有 Cacahe 的控制标头
3:HTML页面之间的连接跳转时,点击超链接时,会强制从服务器下载最新的文档,而不是从本地缓存中浏览
例如:当前股票价格
上述方法会阻止读取本地缓存
如何防止从缓存中读取加载变量
问题:从外部数据源加载数据时,有时浏览器将数据存储在本地缓存中,导致调用loadVariables方法加载时,从本地缓存中读取数据,而不是从原创数据中读取的信息数据 。
解决方法:为保证flash加载的是最新的变量,添加一个随机数变量,这样可以在原创文件中加载最新的数据
例如: 方法一:loadVariables("mypage.asp?nocache=" + random(65000), 0, "POST");
方法二:loadVariables("mypage.asp?nocache=" + getTimer(), 0, "POST");
这样可以确保每次加载的数据都是最新的。
异步获取数据 (AJAX)
该项目有时会使用一些 Ajax 效果。因为比较简单,所以没有Ajax.NET这种东西,手写代码实现。,
第二天,有人给我报错;据说只有第一次读取的值正常,后面的值都不正常;我调试了一下,确实有这样的问题,发现是因为AJAX缓存的问题: 解决 有几种方法:
1、添加标头("Cache-Control: no-cache, must-revalidate"); 在服务器端(如在 php 中)
2、添加anyAjaxObj.setRequestHeader("If-Modified-Since","0");
3、添加 anyAjaxObj.setRequestHeader("Cache-Control","no-cache");
4、添加 "?fresh=" + Math.random(); 在 Ajax URL 参数之后;//当然这里的参数fresh可以任意取
5、第五种方法和第四种方法类似,加了"?timestamp=" + new Date().getTime(); 在 URL 参数之后
6、用 POST 代替 GET:不推荐
1、添加一个随机数 xmlHttp.open("GET", "ajax.asp?now=" + new Date().getTime(), true);
2、写一段代码,禁用异步获取的asp页面中的缓存:Response.Buffer =True Response.ExpiresAbsolute =Now() - 1 Response.Expires=0 Response.CacheControl="no-cache"
3、在ajax发送请求前添加xmlHTTP.setRequestHeader("If-Modified-Since","0");缓存可以被禁用 xmlHTTP.open("get", URL, true); xmlHTTP.onreadystatechange = callHTML ; xmlHTTP.setRequestHeader("If-Modified-Since","0"); xmlHTTP.send();
另一位作者写道:
AJAX 的缓存由浏览器维护。对于发送到服务器的某个 url,ajax 只在第一次请求时与服务器交换信息。在后续的请求中,ajax 不再向服务器提交请求,而是直接从缓存中提交。提取数据。在某些情况下,我们每次都需要从服务器获取更新的数据。思路是在不影响正常应用的情况下,让每个请求的url不一样:在url后面添加随机内容。例如 url=url+"&"+Math.random();
重点:1.每个请求的url都不一样(ajax缓存不行)2.不影响正常应用(最基本的)
---------------- 方法二:(未经证实)在 JSP 中禁用缓存 response.addHeader("Cache-Control", "no-cache"); response.addHeader("过期", "星期四, 1970 年 1 月 1 日 00:00:01 GMT");