2011-05-31 87 views
12

我不知道这个。我看了所有,似乎有很多解决方案,但他们不适合我。我有一个CGI :: Application应用程序生成一个MS Excel电子表格和Spreadsheet :: WriteExcel。这很好的工作了很长时间,直到我们的服务器在几周前发生了硬件故障。我们以停机为借口升级到Windows Server 2008(从2003年)和Apache 2.2.17(从2.2.11开始)。现在,我在尝试下载电子表格时收到发生此错误的客户的投诉,但零星(但太频繁而无法忽略):文件下载结果“IE无法打开这个网站”

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; 
} 

该请求的头看起来正常。这些是在我的本地机器上收集的,介意你。

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 

我们给客户(不能或者不愿意改用其他浏览器),目前的解决方法这个问题是通过将键入https自己切换到SSL。 SSL下载适用于那些尝试过并返回给我们的人。猜测:它可能是一个下游代理搞乱了我们的头文件吗?这可能是为什么它在SSL中工作,并在纯HTTP中的错误? (在这种情况下,服务器升级将是一个不幸的巧合。)

+0

你有没有试过Fiddler在两个方向上检查你的标题?另外,你在其他浏览器中遇到什么错误?我经常发现Firefox或Chrome可以给你一个更详细的错误信息,修复IE不会告诉你的问题! – 2011-05-31 23:41:43

+0

这些标题来自Fiddler。伟大的小工具。 Firefox和Chrome没有问题,并且有问题的用户在其他浏览器中没有。 – wes 2011-05-31 23:58:51

+2

您可能不应该发送VARY标头,因为这在您的方案中没有任何用处,并且会阻止某些IE版本(例如IE8)缓存文件。这反过来可以中断下载,参见例如http://blogs.msdn.com/b/ieinternals/archive/2009/10/03/internet-explorer-cannot-download-over-https-when-no-cache.aspx – EricLaw 2011-06-01 03:30:55

回答

8

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

我想删除这个头文件,并给它一个文件名,IE应该能够将文件保存到磁盘,以便它可以通过Excel打开。

+0

我试图追踪'Vary'头部来自哪里。我认为Apache正在将它添加到某个地方。你能否澄清你的意思是“下载没有文件名”?我在“Content-Disposition”标题中指定了一个文件名。还有其他地方我应该检查吗? – wes 2011-06-01 22:45:45

+2

我向文件名添加了一个时间戳,并将其放入Apache规则中以删除Vary标题。有问题的用户现在报告说它现在可以工作。对于后人,我使用的Apache指令是:'SetEnvIfNoCase Request_URI no-gzip dont-vary' – wes 2011-06-02 19:43:27

2

如果整个系统正常工作,并且只有下载偶尔失败,那么您还可以尝试给文件名指定一个动态名称。

1

我们最近也有类似的情况,并在MS现场检查wholebunchofuselessanswers后,我遇到了一个有趣的blog post流人对这个问题的一些较为清淡,主要是防止缓存(包括Vary头标题最终解决OP的问题,+1)。

但是,IE在其他一些情况下也引发了这个误导性异常,所以我想我会在这里添加它以防其他人遇到相同问题时有用。在我们的例子中,事实证明,生成(Excel)文件并将其发送到响应的JSP的作者已经忘记确保没有空格应该在响应中的文件内容之前

在Java/JSP的文件的情况下(我相信你一定能适应相同的原则,其他语言)时,你有什么事情,发生的问题无辜的前瞻性,如:

<%@ page contentType="text/html; charset="iso-8859-1" pageEncoding="iso-8859-1" errorPage="" language="java" session="true" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
[and so on] 

即有马车作为JSP指令的一部分,而不是,它们在之间生成文件内容并将它们发送给响应,因为这些行之间的回车是空白,可以在IE微妙的机器中抛出虚拟扳手(普通浏览器似乎处理这个很好)。如果你改为这样格式化你的代码:

<%@ page contentType="text/html; charset="iso-8859-1" pageEncoding="iso-8859-1" errorPage="" language="java" session="true" 
%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" 
%>[and so on] 

然后你应该没问题。我敢肯定,大多数web开发者都遇到类似的问题,但在我的情况下,它已经有一段时间了,我不得不多次查看JSP,然后才注意到一行没有这样做......