标签:
环境是Apache+WebLogic做的一个Login网页,瞬间就完了的事儿,IE8却耗费30秒才出来,就算是从本地访问都是。
简单的调查例如IE兼容模式,IE cache,检查server配置等都有人做过了,没有明显的线索。
用IE8的developer tool抓不到网页的第一个请求内容,apache那边的Access Log也没有配置成现实响应耗费时间。
也没多想,还是老方法,socat神器登场,做个假server做转接,打印出来往内容,就可以知道更多,比抓包的好看。(不过windows下的socat似乎不怎么方便安装,我还是安装cygwin里在net分类里选择的socat和netcat(nc))。
Run:
socat -D -v -tcp-listen:localhost:8000 tcp-connect: RealServerIP:80
(-D选项是为了现实新出现的连接,为了保险起见看看)
Browser:
http://localhost:8000/
于是socat现实一大堆HTTP request header:
GET / HTTP1.1 ......
.......
IF-MODIFIED-SINCE: .....某个诡异的2010年的日期..... //这个意思就是问server这个网页在这个日期之后又无更新
而Response呢,三十秒后才来说:
HTTP 304
.....
这个就更诡异了,304就是说没有更新。那你早回答啊,需要这么长时间???
当然,一开始并没有觉察到IF-MODIFIED-SINCE有什么诡异。
后来用firefox和chrome都做了一下,对比一看,人家没有问IF-MODIFIED-SINCE啊。
于是做个验证,
另一个老牌工具netcat登场 (不过后来又nmap公司新出品的ncat更强,但是不容易安装到),当时机器里么有telnet,所以我也只能用这个了,Windows发神经把telnet从默认安装选项里去掉了,几年了还不响应呼声加进来,太不自觉了。
Run:
nc localhost 8000
然后输入HTTP request header..... 最后是个空回车,才会被server接受,
的确是一旦有了IF-MODIFIED-SINCE,就很慢。
暂时到这儿了,至于为啥慢那就是apache那边犯傻了,该咋改就咋改。
话说好奇为啥IE8要问IF-MODIFIED-SINCE啊,其他的Browser都不问?不可能,肯定是server那边第一次返回response时指出了LAST-MODIFIED-DATE才让browser误解的,
看了看response内容的确如此。
那最后推断,如果把browser的cache都清除,肯定第一次会快,第二次就会慢。
Chrome: 推论正确
IE: 推论正确
但是,不是那么简单的就能够清除的,首先要把IE彻底关掉,然后从Control pannel的Internet Option里,清除cache。和Browser里的清除的方法一样。
另外,为了保险起见,还是动用了Process Monitor神器来过滤找到cache的文件在什么目录,现在忘了,反正就是AppData下的什么一个Content.IE5目录下,把这个目录干掉就万无一失了。
Firefox: 版本特殊无法证实。安装上的firefox是强制被设定成不保存cache的,甚至访问履历都没有,一旦关闭就什么都没了。这也许是管理上的policy。没做多研究。
但是从另一个反面得到证实:这个版本的firefox从来不发IF-MODIFIED-SINCE,不管是第几次访问。
转自自己的http://osexp2003.blogspot.jp/
HTTP请求中,IF-MODIFIED-SINCE造成的问题
标签:
原文地址:http://my.oschina.net/u/2253129/blog/420498