我们在web.config中有一个定义,为所有请求设置一个预定义服务器的Access-Control-Allow-Origin标头。像这样:
<customHeaders>
<add name="Access-Control-Allow-Origin"value="http://constantServer.com" />
<add name="Accept-Bytes" value="none" />
</customHeaders>
在某些情况下,我们需要允许访问不同的服务器到特定的资源。我们检查原点并按代码设置Access-Control-Allow-Origin,如下所示:
Response.AddHeader("Access-Control-Allow-Origin", origin);
Response.AddHeader("Access-Control-Allow-Credentials", "true");
问题是浏览器为Access-Control获取了多个值,而不允许它。
我们希望在代码中删除web.config中定义的标头,以防我们需要将其用于不同的来源。
我试图在Application_PreSendRequestHeaders事件中的global.asax中删除它,但我没有在那里找到这个标题。(看来这个标题是在这个事件之后添加的)
由于
答案 0 :(得分:1)
有关如何更改标头值的IHttpModule
解决方案的详细信息,请参阅此answer。它是关于IIS添加的Server
默认标头,我认为这是更难处理的情况。
此question在其答案中提供了许多其他选项,包括安装和使用URL Rewrite(direct link to corresponding answer)。
您可以通过示例将代码更改为仅添加Access-Control-Allow-Credentials
,然后编写网址重写规则,以便将Access-Control-Allow-Origin
更改为origin
。
<system.webServer>
...
<rewrite>
<outboundRules>
<rule name="handleCredentialCors" preCondition="credential">
<match serverVariable="Access-Control-Allow-Origin" pattern=".*" />
<action type="Rewrite" value="origin" />
</rule>
<preConditions>
<preCondition name="credential">
<add input="{RESPONSE_Access_Control_Allow_Credentials}" pattern="true" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
...
</system.webServer>
(未测试的)
我的不好,我忽略了origin
是一个局部变量,而不是文字字符串。
好吧,如果您可以从服务器变量(在URL重写中包含请求标头)中推断origin
值,则URL重写仍可以完成工作。它能够提取值,然后在重写的值中重用它们。但是这条规则写起来可能有点复杂。