文件下载结果"IE无法打开此网站"

wes*_*wes 12 apache perl internet-explorer mod-perl

我对这个感到茫然.我看了很多,似乎有很多解决方案,但它们并不适合我.我有一个CGI :: Application应用程序生成一个带有Spreadsheet :: WriteExcel的MS Excel电子表格.这个工作正常一段时间,直到我们的实时服务器在几周前出现硬件故障.我们使用中断作为升级到Windows Server 2008(从2003年)和Apache 2.2.17(从2.2.11)升级的借口.现在,我在尝试下载电子表格时收到来自此错误的客户的投诉是零星的(但是经常被忽视):

Internet Explorer无法从[site]下载[url].
Internet Explorer无法打开此Internet站点.请求的网站不可用或无法找到.请稍后再试.

我在XP,Vista和7上尝试过IE 7-8,并且无法在本地重现此错误.有问题的用户每次都有,而不是随机.所有投诉都来自IE用户,主要是IE8.

在阅读了几条关于错误消息的帖子后,我添加了-expires标题无济于事.(没有办法直接测试,我必须实施修复并等待一天左右,看看人们是否停止抱怨._.)

sub export_spreadsheet {
   my $self = shift;
   binmode STDOUT;

   my $str;
   open my $fh, '>', \$str;
   my $workbook = Spreadsheet::WriteExcel->new($fh);
   # words words words
   $workbook->close;
   close $fh;

   $self->header_add(-type => 'application/vnd.ms-excel',
                     -expires => '+1d',
                     -attachment => 'export.xls');
   return $str;
}  
Run Code Online (Sandbox Code Playgroud)

请求的标头看起来很正常.这些都是在我的本地机器上收集的,请注意.

HTTP/1.1 200 OK
Date: Tue, 31 May 2011 22:23:17 GMT
Server: Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o mod_perl/2.0.4-dev Perl/v5.10.1
Expires: Wed, 01 Jun 2011 22:23:18 GMT
Content-Disposition: attachment; filename="export.xls"
Vary: Accept-Encoding
Keep-Alive: timeout=5, max=100
Content-Type: application/vnd.ms-excel
Content-Length: 18944
Accept-Ranges: none
Proxy-Connection: Keep-Alive
Run Code Online (Sandbox Code Playgroud)

我们为客户提供的当前解决方法(无法或不愿意切换到备用浏览器)是通过输入https自己来切换到SSL .SSL下载适用于已经尝试过并回到我们这里的人.推测:它可能是一个下游代理搞乱我们的标题?这可能是它在SSL和普通HTTP中的错误中工作的原因吗?(在这种情况下,服务器升级将是一个不幸的巧合.)

mpe*_*ers 8

根据http://support.microsoft.com/kb/316431,IE无法处理文件未缓存但某些外部进程打开的情况.这不是完全相同的情况,但正如EricLaw在评论中提到的,它可能与Vary标题和下载没有文件名这一事实有关.

我将删除该标头并给它一个文件名,IE应该能够将文件保存到磁盘,以便它可以由Excel打开.

  • 我在文件名中添加了一个时间戳,并放入了Apache规则来删除Vary头.有问题的用户报告它现在有效.对于后代,我使用的Apache指令是:`SetEnvIfNoCase Request_URI <url> no-gzip dont-vary` (2认同)