【发布时间】:2021-01-31 06:32:06
【问题描述】:
我的 NodeJS/Express 应用程序以前仅在 IIS 反向代理后面提供服务,并在专用端口上侦听,但现在被配置为侦听服务器的 443 端口。
该框有多个 DNS 别名,其中一个(由 F5 负载平衡器)指向 IIS 端口,因此它会命中反向代理。我将代理重写规则配置为指向端口 443。
hostname.com --> app:443
special.com --> IIS:9303 --> app:443
该应用提供这样的 CORS 标头:
res.set('Access-Control-Allow-Origin', '*');
res.set('Access-Control-Allow-Methods', 'GET, POST, PUT');
res.set('Access-Control-Allow-Headers', 'content-type');
res.set('Access-Control-Allow-Credentials', true);
如果我从反向代理的 customHeaders 部分中删除 Access-Control-Allow-Origin 并在出站部分中设置“覆盖”规则,这在反向代理内部和外部都非常有效 - 在 Chrome 中。
web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Headers" value="Authorization,Content-Type,Cache-Control,Pragma" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,OPTIONS,HEAD,UPGRADE" />
</customHeaders>
</httpProtocol>
<rewrite>
<rules>
<rule name="special" stopProcessing="true">
<match url="(.*)" negate="false" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="special.com" />
</conditions>
<action type="Rewrite" url="https://localhost:443/{R:1}" logRewrittenUrl="true" />
</rule>
</rules>
<outboundRules>
<rule name="Set-Access-Control-Allow-Origin" stopProcessing="false">
<match serverVariable="RESPONSE_Access-Control-Allow-Origin" pattern=".*" negate="false" />
<action type="Rewrite" value="*" replace="true" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
现在,问题来了。当通过 IE 访问 special 站点时,我收到各种导致应用程序无法运行的 CORS 错误。为了使应用程序通过 IE 通过反向代理运行,我似乎必须将 <add name="Access-Control-Allow-Origin" value="*" /> 包含到 IIS customHeaders 部分(除了添加的标头和方法)。当然,这也会破坏应用程序,因此我必须从应用程序内部删除相同的标题。现在,该应用无法在反向代理之外运行!
是否有一种已知的方法可以让应用程序呈现 CORS 标头并让 IIS 反向代理仅通过和返回对它们的请求?有没有办法捕获preflight 并将正确的东西发送到 IE?为什么 OPTIONS 请求没有命中出站规则?
底线:如何让我的应用在代理内部和外部都可以访问,并让 IE 在访问代理时感到高兴?
【问题讨论】:
-
可能是IE版本问题,请检查您的IE版本并升级到最新版本。
-
这是 IE11,我无法控制企业应用认证流程。
标签: iis cors reverse-proxy