现象

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

浏览器访问返回 404弹框截图

原因

IIS 请求筛选默认拦截了两类 URL:

  1. 高位字符 / 非 ASCII 字符:中文文件名触发,常见日志子状态码 404.12
  2. 双重转义序列:文件名中的 + 号触发,常见日志子状态码 404.11

只放开其中一项不够,必须同时允许。

解决方案

在目标上传/下载目录下新增或修改 Web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering 
        allowHighBitCharacters="true" 
        allowDoubleEscaping="true" />
    </security>
  </system.webServer>
</configuration>

配置只作用于该目录,不要全局放开。

验证

  • 原中文文件名链接可正常下载
  • 同目录英文文件仍正常
  • 下载文件名完整、无乱码

下次排查顺序

  1. 确认文件真实存在、路径大小写正确
  2. 看同目录英文文件是否能下载:能下载基本排除权限和 MIME 问题
  3. 看文件名是否含中文、+、括号、空格等特殊字符
  4. 查 IIS 日志子状态码:
    • 404.12:高位字符被拦
    • 404.11:双重转义被拦
    • 404.3:MIME 类型问题
  5. 在目标目录加 Web.config,同时放开:
    • allowHighBitCharacters="true"
    • allowDoubleEscaping="true"

注意

  • allowDoubleEscaping="true" 有安全影响,只放在纯下载目录
  • 该目录不要放可执行脚本,关闭目录浏览
  • 如果以后出现 #、%、? 等更复杂字符仍异常,最终兜底方案是用纯 ASCII 下载脚本: download.aspx?file=... / download.php?file=...,由脚本读取文件并设置 Content-Disposition 输出

一句话结论

文件存在但 IIS 返回 404,优先怀疑中文文件名和 + 号触发了请求筛选;在目标目录加 Web.config 同时允许高位字符和双重转义即可解决。