如何在 IIS 中提供静态文件(用于 CORS / OPTION 请求)?

Posted

技术标签:

【中文标题】如何在 IIS 中提供静态文件(用于 CORS / OPTION 请求)?【英文标题】:How to serve static files (for CORS / OPTION request) in IIS? 【发布时间】:2015-03-27 20:09:54 【问题描述】:

我有一个 AngularJS 应用程序,我正在尝试使用 AJAX 请求从在 IIS 8.5 上运行的 ASP.NET WebApi2 应用程序中提取静态文件。类似于下面的例子-

ng-include="http://server/Content/icon.svg"

如果我在浏览器中导航到该 URL,IIS 很乐意将该文件作为静态文件提供。但是,当我使用 AJAX 请求时,Angular 会首先尝试 OPTIONS 请求,因为它是 CORS 请求,并且 IIS 会抛出 405 Method Not Allowed。

我已尝试将这些标头添加到网站的静态内容文件夹中-

然而这并没有什么不同。此外,IIS 服务器没有安装 WebDAV,这是我看到的可能导致问题的东西。

【问题讨论】:

【参考方案1】:

我有一个带有虚拟目录的 IIS 站点,我从该目录中提供静态文件。

为了从浏览器执行 CORS,我所做的是配置站点的“En tetes de réponses HTTP”,英文应该类似于“HTTP Response Headers”。

在那里我添加了一个名为“Access-Control-Allow-Origin”的新标头,其值为“*”。

从现在开始,我可以在 XHR 中使用静态文件了。

我的实际问题是将 OpenStreetMap 瓷砖提供给文件:///c/xxx/index.html,而 chrome 中的错误是

来自“http://myhost”的图像已被跨域资源共享策略阻止加载:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'null'。

【讨论】:

【参考方案2】:

这适用于我在表单身份验证下访问子目录中的 .png 文件。您应该可以更改扩展名。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <system.web>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>

  <system.webServer>
    <staticContent>
      <mimeMap fileExtension=".*" mimeType="image/png" />
    </staticContent>
    <handlers>
      <clear />
      <add name="StaticFile" path="*" verb="*" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" requireAccess="Read" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" />
    </handlers>
  </system.webServer>

</configuration>

如果您将OPTIONS 添加为Access-Control-Allow-Methods 的动词会怎样,正如this 问题中所回答的那样。

 <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

【讨论】:

可能你需要为此实现一个自定义的 http 处理程序。也许这个网址很有用:***.com/questions/24131711/… 是的,尝试了其他方法,但也没有用 不需要允许 PUT、POST、DELETE 方法。请参阅我的答案以获得解释【参考方案3】:

如果您想在没有任何授权的情况下将静态文件提供给公共互联网,您可以将您的 CORS 策略设置为:

允许 GET 请求 来自任何来源 允许所有请求标头 允许将 OPTIONS 回复缓存 24 小时

Internet 信息服务器可以使用以下 IIS 配置为您的站点进行配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Access-Control-Allow-Methods" value="GET,OPTIONS" />
                <add name="Access-Control-Allow-Origin" value="*" />
                <add name="Access-Control-Allow-Headers" value="*" />
                <add name="Access-Control-Max-Age" value="86400" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

【讨论】:

以上是关于如何在 IIS 中提供静态文件(用于 CORS / OPTION 请求)?的主要内容,如果未能解决你的问题,请参考以下文章

CORS 不允许在 apache2 服务器上提供静态文件

如何在 Windows 10 的 IIS 管理器上启用 CORS?

使用 IIS ApplicationInitialization remapManagedRequestsTo 功能时返回用于提供静态 html 的自定义响应代码?

如何将 CORS(跨域策略)添加到 NGINX 中的所有域?

WebAPI CORS 和静态文件

提供静态图像文件时的 Dotnet Core 3.1 cors 问题