现象
文件真实存在,但浏览器访问返回 404。 同目录英文文件名可正常下载。

原因
IIS 请求筛选默认拦截了两类 URL:
- 高位字符 / 非 ASCII 字符:中文文件名触发,常见日志子状态码 404.12
- 双重转义序列:文件名中的 + 号触发,常见日志子状态码 404.11
只放开其中一项不够,必须同时允许。
解决方案
在目标上传/下载目录下新增或修改 Web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<security>
<requestFiltering
allowHighBitCharacters="true"
allowDoubleEscaping="true" />
</security>
</system.webServer>
</configuration>
配置只作用于该目录,不要全局放开。
验证
- 原中文文件名链接可正常下载
- 同目录英文文件仍正常
- 下载文件名完整、无乱码
下次排查顺序
- 确认文件真实存在、路径大小写正确
- 看同目录英文文件是否能下载:能下载基本排除权限和 MIME 问题
- 看文件名是否含中文、+、括号、空格等特殊字符
- 查 IIS 日志子状态码:
- 404.12:高位字符被拦
- 404.11:双重转义被拦
- 404.3:MIME 类型问题
- 在目标目录加 Web.config,同时放开:
- allowHighBitCharacters="true"
- allowDoubleEscaping="true"
注意
- allowDoubleEscaping="true" 有安全影响,只放在纯下载目录
- 该目录不要放可执行脚本,关闭目录浏览
- 如果以后出现 #、%、? 等更复杂字符仍异常,最终兜底方案是用纯 ASCII 下载脚本: download.aspx?file=... / download.php?file=...,由脚本读取文件并设置 Content-Disposition 输出
一句话结论
文件存在但 IIS 返回 404,优先怀疑中文文件名和 + 号触发了请求筛选;在目标目录加 Web.config 同时允许高位字符和双重转义即可解决。
暂无评论,来抢沙发吧~