CORS 使用带有 ARR 和 URL 重写的 IIS 作为反向代理

Posted

技术标签:

【中文标题】CORS 使用带有 ARR 和 URL 重写的 IIS 作为反向代理【英文标题】:CORS using IIS with ARR and URL Rewrite as a reverse proxy 【发布时间】:2016-08-27 18:29:48 【问题描述】:

我使用带有 ARR 和 URL 重写的 IIS 作为反向代理,以支持到 ElasticSearch 服务器的 HTTPS 连接。据我所知,ES 配置正确,直接 HTTP 连接到 ES 不会导致错误。

但是,当我通过代理连接时,我在浏览器中收到此错误:

跨域请求被阻止:同源策略不允许读取 https://myserver:19201/myindex/_search 的远程资源。 (原因: CORS 标头中缺少令牌“授权” 来自 CORS 预检通道的“Access-Control-Allow-Headers”)

elasticsearch.yml 文件中的相关部分是这样的:

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: ["X-Requested-With","X-Auth-Token","Content-Type","Content-Length","Authorization","engine-name"]
http.cors.allow-credentials: true

为了通过代理启用这些请求,我需要做些什么特别的事情,或者这是一个愚蠢的差事,我应该寻找其他选择?

【问题讨论】:

【参考方案1】:

您可以在this 答案中看到的web.config 下自己编写标题。

但最好使用官方模块:IIS CORS module。

在你的情况下,你需要这个配置:

<cors enabled="true">
  <add origin="THE_URL_YOU_USE_IN_YOUR_BROWSER" allowCredentials="true">
    <allowHeaders allowAllRequestedHeaders="true">
      <add header="X-Requested-With" />
      <add header="X-Auth-Token" />
      <add header="Content-Type" />
      <add header="Content-Length" />
      <add header="Authorization" />
      <add header="engine-name" />
    </allowHeaders>
    <allowMethods>
        <add method="GET" />
        <add method="OPTIONS" />
        <add method="POST" />
        <add method="DELETE" />
        <add method="PUT" />
        <add method="HEAD" />
    </allowMethods>
  </add>
</cors>

【讨论】:

【参考方案2】:

因此,您应该使其工作的一种方法是设置 CORS 以允许所有来源:

Access-Control-Allow-Origin: *

您可以在 IIS 中的 HTTP 响应标头下进行设置。

但是,这首先违背了使用 CORS 的目的,从安全角度来看可能不建议这样做。

【讨论】:

以上是关于CORS 使用带有 ARR 和 URL 重写的 IIS 作为反向代理的主要内容,如果未能解决你的问题,请参考以下文章

couchapp:对带有和不带有正斜杠的 URL 进行不同的重写

使用带有 JSONP 的 AJAX 未捕获的 SyntaxError 和 CORS 错误

带有 URL 重写模块的 IIS 7.5 在回发时将 QueryString 参数加倍

IIS-反向代理

数组方法重写:forEach, map, filter

带有缺失参数的角度重写URL?