【问题标题】:CORS headers for app both inside and outside IIS Reverse Proxy?IIS反向代理内外的应用程序的CORS标头?
【发布时间】: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 通过反向代理运行,我似乎必须&lt;add name="Access-Control-Allow-Origin" value="*" /&gt; 包含到 IIS customHeaders 部分(除了添加的标头和方法)。当然,这也会破坏应用程序,因此我必须从应用程序内部删除相同的标题。现在,该应用无法在反向代理之外运行!

是否有一种已知的方法可以让应用程序呈现 CORS 标头并让 IIS 反向代理仅通过和返回对它们的请求?有没有办法捕获preflight 并将正确的东西发送到 IE?为什么 OPTIONS 请求没有命中出站规则?

底线:如何让我的应用在代理内部和外部都可以访问,并让 IE 在访问代理时感到高兴?

【问题讨论】:

  • 可能是IE版本问题,请检查您的IE版本并升级到最新版本。
  • 这是 IE11,我无法控制企业应用认证流程。

标签: iis cors reverse-proxy


【解决方案1】:

您可以尝试将“跨域访问数据源”的设置更改为启用。

  1. 在 Internet Explorer 中,单击工具 > Internet 选项以打开 Internet 选项窗口。
  2. 在“安全”选项卡上,单击“本地 Intranet 区域”,然后单击 自定义级别打开安全设置 - 本地 Intranet 区域 窗口。
  3. 在其他设置跨域访问数据源下, 点击启用。

【讨论】:

  • 我的问题更多是关于如何允许 IIS 反向代理访问面向客户端的应用程序,因为一个 CORS 标头拒绝多个值,并且出站规则未针对飞行前/选项请求。 :-\
  • 您的应用程序不是在 chrome 中运行,但是当您通过 IE 访问该站点时,您会收到 CORS 错误?
  • 是的,但解决方案是让 IIS 为预检和内容请求一致地发送标头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2023-03-08
  • 2015-11-15
  • 1970-01-01
  • 2012-10-09
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多