You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET WebForms中URL含'prn'参数报错问题咨询

为什么含prn/con参数的URL会在IIS 10中报错?

这问题我之前碰到过好几次,根源其实是Windows系统本身的保留设备文件名限制,IIS继承了这个系统级规则,导致包含这类名称的请求被提前拦截了。

核心原因:Windows的遗留保留名

Windows从DOS时代遗留了一批特殊设备别名,比如con(控制台)、prn(打印机端口)、aux、nul、com1-com9、lpt1-lpt9等。这些名称不是普通的字符串,系统会将它们识别为硬件设备的映射。

IIS在处理请求的早期管道阶段就会检查URL路径中的每个段,如果匹配这些保留名,会直接拒绝请求——这个拦截发生在你的ASP.NET应用程序错误处理(web.config配置)之前,所以你的错误处理逻辑根本没机会生效。

而prm这类名称不在系统保留列表里,所以IIS不会拦截,请求能顺利到达你的应用处理逻辑,自然不会报错。

解决办法

1. 最简单的规避方案:修改参数命名

直接把prn这类参数值替换成类似prn_、prn-code的别名,完全避开系统保留名。这是最安全也最省心的做法,不需要改动服务器配置。

2. 修改IIS请求过滤规则(允许特定保留名)

如果必须使用prn/con这类名称,可以在web.config里添加配置,移除IIS默认拦截的对应隐藏段:

<system.webServer>
  <security>
    <requestFiltering>
      <hiddenSegments>
        <remove segment="prn" />
        <remove segment="con" />
      </hiddenSegments>
    </requestFiltering>
  </security>
</system.webServer>

⚠️ 注意:这个操作会降低一点安全性,因为隐藏段原本是用来防止访问敏感系统路径的,所以只移除你需要的特定名称,不要批量移除所有。

3. 启用双重转义(针对编码后的参数)

如果你的参数是经过URL编码的(比如prn变成%70%72%6E),IIS默认会阻止这类双重转义请求,可以通过配置开启允许:

<system.webServer>
  <security>
    <requestFiltering allowDoubleEscaping="true" />
  </security>
</system.webServer>

⚠️ 同样,开启这个选项需要注意安全风险,确保你的应用已经做好了输入验证,防止路径遍历等攻击。

总结

优先推荐第一种方案,毕竟系统保留名的限制是底层的,避开比强行突破更稳妥。如果必须使用,再考虑后面的配置修改。

内容的提问来源于stack exchange,提问作者Lucian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:06:32