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

IIS请求拦截规则创建求助:拦截不符合自定义头要求的请求

解决IIS请求拦截规则的问题

嘿Tom,我看了你遇到的问题——你的URL重写规则把所有请求都拦下来了,这大概率是因为规则没考虑到请求头完全不存在的情况。咱们一步步来搞定它:

问题根源

你当前的规则只判断了「请求头值不等于123」的情况,但当请求里压根没有HTTP_MyMandatoryHeader这个自定义头时,{HTTP_MyMandatoryHeader}会返回空字符串。这时候^123$的正则匹配失败,加上negate="true",条件就会成立,规则就会触发拦截。结果就是不管有没有这个头,只要值不是123(或者头不存在),全被拦了——但你其实是想只放行「头存在且值为123」的请求,对吧?

修正后的规则

我们需要添加两个条件,用逻辑或(matchAll="false")来覆盖两种需要拦截的场景:

  1. 请求头HTTP_MyMandatoryHeader不存在
  2. 请求头的值不等于123

下面是修正后的完整配置:

<rewrite>
  <rules>
    <rule name="BlockInvalidRequests" stopProcessing="true">
      <match url=".*" />
      <conditions logicalGrouping="MatchAny">
        <!-- 条件1:请求头不存在 -->
        <add input="{HTTP_MyMandatoryHeader}" pattern=".+" negate="true" />
        <!-- 条件2:请求头值不是123 -->
        <add input="{HTTP_MyMandatoryHeader}" pattern="^123$" negate="true" />
      </conditions>
      <action type="CustomResponse" statusCode="403" 
              statusReason="Forbidden: Access is denied." 
              statusDescription="You must provide the valid HTTP_MyMandatoryHeader to access this resource." />
    </rule>
  </rules>
</rewrite>

关键部分解释

  • logicalGrouping="MatchAny":表示只要满足任意一个条件,就触发规则(也就是拦截请求)
  • 第一个条件pattern=".+" negate="true":.+匹配任意非空字符串,加上negate="true"就表示「当请求头为空(即不存在)时条件成立」
  • 第二个条件和你原来的逻辑一致:「当请求头值不是123时条件成立」

验证步骤

  1. 把修正后的配置替换到你的IIS web.config里
  2. 测试三种请求:
    • 不带HTTP_MyMandatoryHeader的请求:应该返回403
    • 带HTTP_MyMandatoryHeader但值不是123的请求:应该返回403
    • 带HTTP_MyMandatoryHeader且值为123的请求:应该正常访问资源

这样就能精准拦截不符合要求的请求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:47:39