IE:无法从*下载*。无法打开此互联网站点。所请求的站点不可用或无法找到。

47

我的网站在IE浏览器上出现问题。我有一个文件Document.ashx,根据查询字符串中传递的参数从我的数据库中获取文档。

如果满足以下条件,该文件可以正常工作:

  • 您在我的网站上点击下载链接。
  • 您访问我的网站并将URL粘贴到地址栏中并访问它。
  • 即使出现错误,您已经访问过文档链接一次。

如果不满足以下条件,则无法正常工作:

  • 您没有使用当前IE打开我的网站并在地址栏中粘贴链接。它会显示以下错误:

Windows Internet Explorer

无法从MyHostName下载Document.ashx。

无法打开此Internet站点。

所请求的站点不可用或找不到。

请稍后再试。

有没有人知道是什么原因造成的。自然而然,在Firefox中它很好用。

我让办公室的几个人尝试了它,并且他们都遇到了同样的问题。他们都说在Firefox中它很好用。


1
网络服务器是否记录任何错误?网络服务器是否记录请求日志? - ThatBlairGuy
如果我在Document.ashx的ProcessRequest事件上设置断点,它会被调用并且运行时不会出错。 - Smartie
我不确定这是什么意思。听起来像是服务器出了些问题。我能提供的最好建议是通过代码进行调试,并确保发送回客户端的内容正是您认为的内容。 - ThatBlairGuy
我发现如果我不设置context.Response.ContentType,那么第一次就能正常工作。你有什么想法为什么会这样? - Smartie
1
我还发现,如果我删除context.Response.Cache.SetCacheability(HttpCacheability.NoCache)并添加回contenttype,它就可以工作。 - Smartie
13个回答

24

就像rymo所说,设置Cache-Control:private,如果你的响应头恰好有Pragma: no-cache,你还必须将其更改为Pragma:token


我现在推荐这里概述的解决方案:https://dev59.com/FnA75IYBdhLWcg3wOGPS#19145399 - rymo
1
我已经在我的程序中添加了这个,但在我的情况下,缓存控制被覆盖并显示为no-cache no-store?有什么解决办法吗? - Sai prateek
最近我们的头部中悄悄地加入了Pragma: no-cache,导致所有在IE8中的下载都出问题了。至今仍然不知道它是怎么出现的,但是将Pragma: token设置上去解决了问题。你真是救命恩人! - mpen
这里评论已经很晚了,但你在哪里找到“Pragma:token”的文档?在我看来,这可能是对规范(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32)的误读,将符号“token”解释为字面上的“token”。似乎将Pragma设置为除“no-cache”(或完全删除)以外的任何内容都会导致错误消失,但在缓存方面会付出什么代价呢? - Omaha

19

16

原来IE8是可以实现完全禁用缓存的,但是它对头部信息的顺序非常挑剔。因此,不要使用回退到“私有”(允许某些缓存,可能无法满足您的安全需求),而应该使用以下方法:

Cache-Control: no-store, no-cache, must-revalidate

当以这个确切的顺序指定时 - 首先是 no-store 然后是 no-cache - IE8将允许文件下载而不会出错。还要确保未设置 Pragma 标头。


2
我刚刚点了赞,但那只是基于它能够正常工作的信念。不幸的是,在我们的测试中它并没有起作用,我们必须选择Cache-Control: private或重构我们的代码。 - Eirik H
我们最终采用了no-store和Pragma:private,如此处所述:https://dev59.com/XnNA5IYBdhLWcg3wrf83#17276263 - Eirik H
我们不得不修复“Cache-Control”值的顺序并删除Pragma头。 - Guillaume Polet
1
我们遇到了这个问题;确实,顺序很重要,我测试了两种方式,如果顺序不正确,它就会失败。 - jdg

7

这个问题出现在IE8和可能更早的版本中,但在IE9+中已经解决。它与通过SSL下载文档有关。

为了解决我的应用程序中的问题,我不得不向下载中添加以下两个标头(使用PHP编写):

header("Cache-Control: private");
header("Pragma: cache");

1
这对我很有用。我尝试了许多不同的标题(包括“Cache-Control:no-store,no-cache,must-revalidate”),除此之外没有任何区别。 - Moulde
我也遇到了IE 8的同样问题,解决方案也一样。干得好,丹。 - Déjà vu

6

3

这是怎么回事呢?问题出在立即缓存过期或无缓存上。

按照以下步骤修复问题:

打开服务器系统 -> 运行Inetmgr -> 在文件夹上右键并选择属性(例如images)-> httpHeaders -> 现在,要么取消选中启用内容过期,要么勾选之后过期并设置1分钟。

这适用于IIS 5。

IIS 6/7也有类似的设置。

祝编程愉快!


这也发生在Linux / Apache服务器上。 这更多与头有关。 - Simon East

1
如果您正在使用asp.net,请删除具有缓存设置的代码。
注释以下内容。
       Response.Clear();
   Response.Buffer = true;
   Response.Charset = "";
   **//Response.Cache.SetCacheability(HttpCacheability.NoCache);**
   Response.ContentType = contentType;
   Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
   Response.BinaryWrite(bytes);
   Response.Flush();
   Response.End();

1

我曾经遇到同样的问题,尝试了所有上述纠正方法都无果而终,感到非常沮丧。显然,我不想在客户端机器上解决问题,所以我只是从头部删除了“Pragma”参数,然后它就开始正常工作了。

问题解决了。


0

我们在使用带有 IE8 的MVC控制器标记为NoCache时遇到了同样的问题。这会设置Response.Cache.SetNoStore,从而破坏IE中的文件下载。

要解决这个问题 - 您可以通过反射重置Http缓存策略


0
我们在 www.Qiqqa.com 的 ClickOnce 部署中遇到了同样的问题。我怀疑这与 IE 在接收到 application/octet-stream 时进行的“MIME 类型嗅探”有关 - 我猜是为了保护用户免受恶意软件的侵害。
无论如何,为了解决这个问题,我们将 .deploy 文件的 MIME 类型更改为text/plain,虽然这并不理想,但同时,我也不知道什么情况下我们会在 ClickOnce 之外的服务器上拥有一个.deploy文件供用户浏览。
问题解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接