如何在IIS Rewrite规则中使用Sec-Fetch-Site请求头限制资源访问
IIS Rewrite规则实现资源访问限制
要实现你需要的资源访问控制,核心是结合Sec-Fetch-Site请求头(现代浏览器)和Referer请求头(兼容旧浏览器),同时精准匹配要保护的资源类型。以下是经测试有效的规则配置:
完整web.config规则代码
<rewrite> <rules> <rule name="Restrict Resource Access" stopProcessing="true"> <!-- 匹配需要保护的资源类型,可根据需求添加/修改后缀 --> <match url="\.(jpg|jpeg|png|gif|bmp|html|htm)$" ignoreCase="true" /> <conditions logicalGrouping="MatchAny"> <!-- 条件1:现代浏览器中,请求来源不是同域 --> <add input="{HTTP_SEC_FETCH_SITE}" pattern="^same-origin$" negate="true" /> <!-- 条件2:无Sec-Fetch-Site头时,检查Referer不是本站域名(兼容旧浏览器) --> <add input="{HTTP_REFERER}" pattern="^https?://your-domain\.com/" negate="true" /> <!-- 直接访问地址栏时,Referer为空,也会触发这个条件 --> </conditions> <!-- 不符合条件时返回403禁止访问 --> <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Access to this resource is restricted." /> </rule> </rules> </rewrite>
规则说明
- 资源匹配:
match节点中的正则表达式匹配需要保护的文件后缀,你可以根据实际需求添加(如.svg、.css)或删除不需要的类型。 - 条件逻辑:
MatchAny表示只要满足其中一个条件就触发规则:- 现代浏览器中,
Sec-Fetch-Site头不等于same-origin(包括直接访问时的none、跨域请求的cross-site) - 旧浏览器或未发送
Sec-Fetch-Site头时,Referer头不包含本站域名(直接访问时Referer为空,也会命中此条件)
- 现代浏览器中,
- React动态加载支持:React从本站页面发起的动态资源请求,
Sec-Fetch-Site会被浏览器设置为same-origin,因此不会触发规则,资源可正常加载。
注意事项
- 替换规则中的
your-domain\.com为你的实际域名(如果有多个域名,可添加多个add节点并设置logicalGrouping="MatchAny") - 测试验证:
- 直接在地址栏输入资源URL,应返回403
- 本站页面(包括React应用)中加载资源,应正常显示
- 将资源嵌入其他网站页面,资源会加载失败
- 若需要允许子域访问,可修改Referer的正则为
^https?://(.+\.)?your-domain\.com/
内容的提问来源于stack exchange,提问作者Eric Malalel
相关产品推荐
相关产品推荐

