当前位置:首页 > 焦点

iis部署网站浏览时弹出下载文件

浏览器地址栏里敲下域名,署网回车,站浏页面没出来,弹出反而弹出一个下载框——文件名叫default.aspx,下载大小只有几KB。文件这种鬼事情,署网干过IIS部署的站浏人多半都撞见过。别急着骂服务器,弹出问题大概率出在IIS的下载“处理程序映射”上。

IIS这玩意儿默认只认它自己名单里的文件文件类型。aspx、署网asp、站浏html这些后缀,弹出它知道该交给ASP.NET框架去解析。下载可如果你把网站发布成“文件系统”模式,文件或者代码里用了某种特殊的路由方式,IIS可能压根没把请求当成一个页面来处理。它一看,这文件不是我能执行的,那就当静态资源发给你吧——浏览器收到一个不认识格式的响应,自然就弹下载框。

我遇到过最典型的案例,是同事把.NET Core应用部署到Windows Server 2012上。他全程照着教程敲命令,装完运行时,配好站点,访问首页——下载了。他懵了,我也懵了。后来查了半天,发现他漏装了IIS的“ASP.NET Core模块”。那个模块没注册,IIS就把所有请求都扔给了静态文件处理器。页面文件被当成普通文件下载,连CSS和JS都下。整个站点就是个“文件下载服务器”。

另一个常见坑,是应用程序池的“托管管道模式”设错了。如果你跑的是经典模式,而代码是给集成模式写的,某些请求路径会绕过托管代码直接落到IIS手里。结果就是,POST请求可能正常,但GET一个带点号的路径就触发下载。比如访问/api/user/info.json,IIS一看,哦,.json没配置过,下载吧。可你的接口返回的明明是JSON数据,浏览器却当成附件保存了。

还有一个特别隐蔽的——你根本没配MIME类型。IIS对未知扩展名的默认行为是“拒绝”,但如果你在站点级别加了application/octet-stream的通配符,那所有没被显式映射的文件都会变成可下载。这招有时候是故意的,用来保护某些敏感文件不直接暴露在浏览器里。但你要是误加在根目录,那整个站点的图片、字体、PDF全都会变成下载行为。别问我怎么知道的,有一次我就这么干过,然后被测试妹妹追着骂了三天。

解决办法其实不复杂。打开IIS管理器,选中你的站点,双击“处理程序映射”,看看有没有ExtensionlessUrlHandler-Integrated-4.0或者StaticFile这类条目。如果请求应该走ASP.NET但实际走了StaticFile,那就是映射顺序的问题。把ASP.NET相关的映射提到前面去。如果你用的是.NET Core,检查一下web.config里有没有aspNetCore节点,没有就手动加,或者干脆重装一遍模块。

要是你确认模块和映射都没毛病,那再查一下应用程序池的“启用32位应用程序”选项。有些老代码跑在32位模式,但IIS默认是64位。池子跑错了位数,托管模块根本加载不了,请求全被当作静态文件处理。这个问题在Windows 2008 R2上尤其常见,后来微软出了补丁才好一些。

最后说个土办法,排查的时候直接用浏览器开发者工具看响应头。如果返回的Content-Type是application/octet-stream,那基本就是IIS没认出这个文件类型。如果是text/html但还弹下载,那才是怪事——八成是浏览器插件捣乱,换个无痕窗口试试。

干这行久了,你会发现IIS的下载框就像它的冷笑话——明明是你自己没配置好,它却表现得特别无辜。下次再撞见,别慌,按着处理映射、托管模块、MIME类型、应用程序池这个顺序捋一遍,多半能揪出元凶。

分享到: