HTTP请求中,IF-MODIFIED-SINCE造成的问题

有个调查,要搞清楚为什么IE8访问特别慢,IE11和别的Browser都没问题。

环境是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/

你可能感兴趣的:(apache,http,ie8,socat)