使用服务器变量配置URL重写以支持多个源

时间:2016-10-21 18:08:03

标签: url-rewriting cors iis-8

我几天前正在处理CORS问题,我需要支持多个来源。我做了一些研究,发现有几个帖子指向我这个伟大的工具(URL Rewrite)。我按照Paco Zarate提示获得了我想要的解决方案:Access-control-allow-origin with multiple domains使用URL Rewrite。我还在这里找到了另一篇文章:http://www.carlosag.net/articles/enable-cors-access-control-allow-origin.cshtml向我展示了如何在URL Rewrite中使用不同的配置方法来实现相同的解决方案。

Paco Zarate解决方案就像魅力一样。为什么我还在问问题?它仅用于学习目的。而且我认为第二个帖子配置会产生一个更优雅的我希望列入白名单的起源/域名列表。为了便于维护,我可以直接转到Rewrite Maps并查看我的所有AllowedOrigins。

当尝试第二篇文章的解决方案时,我收到了以下消息:浏览器调试工具的Console选项卡下的ERR_CONNECTION_RESET。 “网络”标签下的请求标题显示"会显示临时标题"

非常感谢提前。

我的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
    <httpErrors errorMode="Detailed" />
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Headers" value="Origin, Content-Type, Accept" />
            <add name="Access-Control-Request-Method" value="POST" />
            <add name="Access-Control-Allow-Credentials" value="true" />
            <add name="Access-Control-Allow-Origin" value="http://localhost:8080" />
        </customHeaders>
    </httpProtocol>
    <rewrite>
        <rules>
            <rule name="Capture Origin Header"> 
        <match url=".*" /> 
        <conditions>
                    <add input="{HTTP_ORIGIN}" pattern=".+" /> 
        </conditions> 
        <serverVariables>
                    <set name="CAPTURED_ORIGIN" value="{C:0}" /> 
        </serverVariables> 
        <action type="None" /> 
        </rule>
            <rule name="Preflight Options" enabled="false" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="{REQUEST_METHOD}" pattern="^OPTIONS$" />
                </conditions>
                <action type="CustomResponse" statusCode="200" statusReason="Preflight" statusDescription="Preflight" />
            </rule>
        </rules>
        <rewriteMaps>
            <rewriteMap name="AllowedOrigins">
                <add key="http://somedomain:8080" value="http://localhost:8080" />
            </rewriteMap>
        </rewriteMaps>
         <outboundRules> 
            <rule name="Set-Access-Control-Allow-Origin for known origins"> 
                <match serverVariable="RESPONSE_Access-Control-Allow-Origin" pattern=".+" negate="true" /> 
                <conditions> 
                    <add input="{AllowedOrigins:{CAPTURED_ORIGIN}}" pattern=".+" /> 
                </conditions> 
                <action type="Rewrite" value="{C:0}" /> 
            </rule> 
        </outboundRules> 
    </rewrite>
    <tracing>
        <traceFailedRequests>
            <add path="*">
                <traceAreas>
                    <add provider="WWW Server" areas="Rewrite" verbosity="Verbose" />
                </traceAreas>
                <failureDefinitions timeTaken="00:00:00" statusCodes="500" verbosity="Error" />
            </add>
        </traceFailedRequests>
    </tracing>
</system.webServer>

1 个答案:

答案 0 :(得分:0)

尝试使用URL重写模块启用CORS时遇到很多问题,经过大量的故障排除后,我发现对于IIS 7.5+,您可以使用IIS CORS模块:https://www.iis.net/downloads/microsoft/iis-cors-module

您的web.config应该是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="http://localhost:8080" allowCredentials="true">
                <allowMethods>                    
                    <add method="POST" />
                </allowMethods>
            </add>
        </cors>
    </system.webServer>
</configuration>

您可以在以下位置找到配置参考:https://docs.microsoft.com/en-us/iis/extensions/cors-module/cors-module-configuration-reference