关于:HTTP Header -> Content-Type: text/plain Cache-Control: no-cache IE浏览器弹出错误下载对话

下午遇到一个很奇怪的现象,一个网址: http://192.168.1.3/login?action=a&fr=b.com

注意网址后面的参数形式,action参数在前,最后一个参数值的尾部含有.com

login程序的代码是这样的:

pw.println("Content-Type: text/plain");

pw.println("Cache-Control: no-cache");

pw.println("Content-Length: " + "abcd".getBytes().length); //内容大小

pw.println();

pw.print("abcd"); 
pw.flush();

如果有IE浏览器的地址栏里直接输入网址,按回车后,并不会显示abcd,而是会弹出一个下载对话框:

经过3个小时的测试,发现:

1. 当Content-Type设置为 text/plain ,同时设置 Cache-Control: no-cache,在IE浏览器上就会出现下载对话框,但在firefox和chrome上可以正常显示abcd

2. 当Content-Type设置为 text/plain ,同时设置 Cache-Control: private 或 不设置 Cache-Control,在IE浏览器上可以正常显示abcd

3. 当Content-Type设置为 text/html,同时设置 Cache-Control: no-cache,在IE浏览器上可以正常显示abcd

4. 在IE浏览器中,前面一个参数是action最后一个参数值是.com,就会出现上面这样的问题,在其它浏览器可以正常显示内容。

5. 在IE浏览器中,如果把action参数放到最后,把fr参数放到前面,就可以显示出 abcd

种种迹象表明:

在ie浏览器中,如果直接把上面的 http://192.168.1.3/login?action=a&fr=b.com复制到地址栏中按回车直接打开的时候:

1. 如果程序中返回的Content-Type: text/plain 那么HTTP状态码一定要HTTP/1.1 200 OK才行,不然就会出现一个错误的下载对话框,其它浏览器不存在这样的问题
2. 反之,如果 Content-Type: text/html,那么HTTP状态码可以是其它的各种类型状态码。

另注:如果用户是从一个链接上点击进入这个网址,则可以正常显示内容,而不会出现像上面那样的错误对话框。

2011-07-06

原文地址:https://www.cnblogs.com/personnel/p/4583078.html