iis - 在 web.config (IIS) 中为非 .NET 应用程序设置 CORS
问题描述
我正在尝试使用 IIS CORS 模块(https://www.iis.net/downloads/microsoft/iis-cors-module)在站点上允许 CORS,但我遇到了麻烦。
这是我的 web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="https://my.site" allowCredentials="false" maxAge="120">
<allowHeaders allowAllRequestedHeaders="true"></allowHeaders>
<allowMethods>
<add method="GET" />
<add method="POST" />
<add method="PUT" />
</allowMethods>
</add>
</cors>
</system.webServer>
</configuration>
使用此设置,OPTIONS(飞行前)请求工作正常,但任何进一步的请求(GET,POST)由于缺少Access-Control-Allow-Origin而引发浏览器异常 我尝试将以下内容添加到 web.config:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https:/my.site" />
</customHeaders>
</httpProtocol>
但是以这种方式, OPTIONS 失败了,因为有 2 个Access-Control-Allow-Origin实例
仅使用自定义标头,预检失败并显示代码 500(我认为 IIS 不支持没有 CORS 模块的 OPTIONS 方法)。
IIS CORS 模块文档很差,谷歌搜索我只能找到与 .NET 代码相关的信息,但这不是我的情况。我无法修改代码(而且它不是 .NET),我需要对 IIS 采取行动。
如何使 IIS 正确响应 CORS 请求?
解决方案
从您发布的代码来看,您似乎没有正确添加您的来源。原始行应包含(完全限定域名)FQDN或与其匹配的一些正则表达式。
正确的行如下所示:
<add origin="https://my.site.com" allowCredentials="false" maxAge="120">
您可以使用以下方式允许您的域的子域:
<add origin="https://*.site.com" allowCredentials="false" maxAge="120">
从它的声音来看,您没有收到您想要从 Web 服务器返回的标头。这可能是由于网络服务器只返回 CORS 安全标头。
使用 Microsoft 的IIS CORS 博客,我在配置中添加了将在请求中公开标头的内容。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add origin="https://my.site" allowCredentials="false" maxAge="120">
<allowHeaders allowAllRequestedHeaders="true">
<add header="DNT" />
<add header="Host" />
<add header="Origin" />
<add header="Referrer" />
<add header="User-Agent" />
</allowHeaders>
<allowMethods>
<add method="GET" />
<add method="POST" />
<add method="PUT" />
</allowMethods>
<exposeHeaders>
<add header="DNT" />
<add header="Host" />
<add header="Origin" />
<add header="Referrer" />
<add header="User-Agent" />
</exposeHeaders>
</add>
</cors>
</system.webServer>
</configuration>
但是,根据此 CORS 文档OPTIONS 请求不会将 Allow Headers 或 Expose Headers 配置应用于它们。希望这不是这里的问题。
下面我添加了我能想到的最基本的 CORS 请求。如果此请求有效,则可能是您遇到的客户端问题。
fetch('example.com', {
method: 'GET',
mode: 'cors',
credentials: 'include',
headers: { 'Authorization': authString }
}).then(
response => response.json()
); // parses JSON response into native JavaScript objects
推荐阅读
- angularjs - AngularJS 是否深度监视模板中的对象绑定?
- bash - 尝试测试未设置的变量,以及在调试模式下启动 Docker 入口点 Java 应用程序的特定值
- python - 有没有办法使用 read_sql_query 并且查询有 WHERE 列 = 变量?
- angular - 将项目更新到 Angular 8
- database - 在 Anylogic 中从数据库中读取数据
- pandas - 如何根据数据框列的条件进行比较?
- android - Android 应用程序中的语言翻译错误
- c# - 如何从内存中获取任何进程的网络流量?
- hyperlink - 使用 Clang 和 LLVM ELF ld.LLD 链接器时,如何从可执行文件中删除符号?
- python - 为“星号前缀”后缀提取域