如何更新IIS重写规则以解决CORS及Referrer Policy限制下的JavaScript请求问题
解决IIS重写规则下Referrer Policy导致的JS请求失败问题
嘿,我帮你梳理下当前配置的问题,然后给出调整方案:
首先你当前的入站重写规则匹配的是^api/(.*),但你的实际请求路径是/back/api/...——这就导致规则根本不会触发,这是第一个要修正的点。
再来说Referrer Policy: strict-origin-when-cross-origin的问题:这个策略会在跨域请求时只发送源地址(而非完整的Referrer路径),如果目标站点remotesite对Referrer有严格要求,或者浏览器因为这个策略限制了请求发起,就会导致JS请求失败。我们需要调整响应头的Referrer Policy,同时完善CORS配置。
以下是更新后的完整配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <!-- 修正匹配规则,精准对应/back/api/开头的请求 --> <rule name="ForwardBackApi" stopProcessing="true"> <match url="^back/api/(.*)" /> <action type="Rewrite" url="https://remotesite/back/api/{R:1}" /> <!-- 可选:如果需要把前端的原始Referrer传递给目标站点,保留这个配置 --> <serverVariables> <set name="HTTP_REFERER" value="{HTTP_REFERER}" /> </serverVariables> </rule> </rules> <outboundRules> <clear /> <!-- 保留原有的CORS Origin规则,确保跨域请求的Origin被正确允许 --> <rule name="SetCorsOrigin" priority="1"> <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="true"> <add input="{HTTP_ORIGIN}" pattern="(.*)" /> </conditions> <action type="Rewrite" value="{C:0}" /> </rule> <!-- 添加规则:修改响应的Referrer Policy,放宽跨域请求的限制 --> <rule name="AdjustReferrerPolicy" priority="2"> <match serverVariable="RESPONSE_Referrer_Policy" pattern=".*" /> <action type="Rewrite" value="no-referrer-when-downgrade" /> </rule> <!-- 可选:如果目标站点要求Referrer必须是你的域名,启用这个规则 --> <!-- <rule name="RewriteRefererHeader" preCondition="IsBackApiRequest"> <match serverVariable="HTTP_REFERER" pattern=".*" /> <action type="Rewrite" value="https://mysite/" /> </rule> <preConditions> <preCondition name="IsBackApiRequest"> <add input="{REQUEST_URI}" pattern="^back/api/.*" /> </preCondition> </preConditions> --> </outboundRules> </rewrite> <!-- 补充CORS常用响应头,确保预检请求能正常通过 --> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" /> </customHeaders> </httpProtocol> </system.webServer> </configuration>
关键修改说明:
- 修正入站匹配规则:把原规则的匹配路径改成
^back/api/(.*),这样才能正确捕获/back/api/...开头的请求,stopProcessing="true"是为了避免后续规则干扰。 - 调整Referrer Policy:新增的
AdjustReferrerPolicy规则会把响应头里的Referrer-Policy重写为no-referrer-when-downgrade——这个策略允许在跨域请求时发送完整的Referrer信息(只要不从HTTPS降到HTTP),刚好解决strict-origin-when-cross-origin带来的限制。如果你需要更宽松的设置,也可以换成origin(只发源地址)或者unsafe-url(发完整URL,注意安全风险)。 - 完善CORS配置:在
httpProtocol下添加了常用的跨域响应头,确保浏览器的OPTIONS预检请求能正常通过,避免跨域请求被拦截。 - 可选的Referrer头修改:如果目标站点
remotesite要求请求的Referrer必须是你的域名,可以启用注释里的规则,把转发请求的Referrer设置为你的站点地址。
额外提醒:
- 确保你的IIS已经装了URL Rewrite和**ARR(Application Request Routing)**模块,不然重写和反向代理功能用不了。
- 改完配置后,记得重启IIS站点生效。如果还是有问题,打开浏览器开发者工具的Network面板,看看请求的Referrer头和响应的Referrer-Policy头是不是符合预期。
内容的提问来源于stack exchange,提问作者barteloma




