2011-05-31 90 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,然後才注意到一行沒有這樣做......