IIS请求拦截规则创建求助:拦截不符合自定义头要求的请求
解决IIS请求拦截规则的问题
嘿Tom,我看了你遇到的问题——你的URL重写规则把所有请求都拦下来了,这大概率是因为规则没考虑到请求头完全不存在的情况。咱们一步步来搞定它:
问题根源
你当前的规则只判断了「请求头值不等于123」的情况,但当请求里压根没有HTTP_MyMandatoryHeader这个自定义头时,{HTTP_MyMandatoryHeader}会返回空字符串。这时候^123$的正则匹配失败,加上negate="true",条件就会成立,规则就会触发拦截。结果就是不管有没有这个头,只要值不是123(或者头不存在),全被拦了——但你其实是想只放行「头存在且值为123」的请求,对吧?
修正后的规则
我们需要添加两个条件,用逻辑或(matchAll="false")来覆盖两种需要拦截的场景:
- 请求头
HTTP_MyMandatoryHeader不存在 - 请求头的值不等于
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时条件成立」
验证步骤
- 把修正后的配置替换到你的IIS web.config里
- 测试三种请求:
- 不带
HTTP_MyMandatoryHeader的请求:应该返回403 - 带
HTTP_MyMandatoryHeader但值不是123的请求:应该返回403 - 带
HTTP_MyMandatoryHeader且值为123的请求:应该正常访问资源
- 不带
这样就能精准拦截不符合要求的请求啦!
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

