首页 > 解决方案 > 如果原始标头存在,API 管理返回空响应

问题描述

我正在通过 Azure ApiManagement 向 API 发送请求。

如果存在 Origin 标头并且它不是 Cors 策略中指定的标头之一,即使邮递员也会返回空响​​应。

一旦我禁用 Origin 标头,我就可以获得响应。

因此,对于基于 Web 的应用程序,问题如下,我们必须启用 cors,

   <cors allow-credentials="true">
        <allowed-origins>
          ${env:CorsOrigin}
        </allowed-origins>
        <allowed-methods>
          <method>*</method>
        </allowed-methods>
        <allowed-headers>
          <header>*</header>
        </allowed-headers>
      </cors>

但是我们的cordova应用程序也调用了相同的api,默认情况下cordova会追加Origin: file://然后Api管理正在做奇怪的事情它会削减身体。所以响应将是空的。如果我直接对 azure 函数执行相同的请求,我将得到适当的响应,并且由于cordova 不在乎(在我们的情况下是可以的)关于 CORS 我希望 api 管理不会削减响应。

Api 管理也不允许我输入 *,因为 allow-credentials="true" 并且我不能将它设置为允许file://

标签: azure-api-management

解决方案


APIM 不支持带有文件方案的源,仅支持 http 和 https。我看看我们能不能修好。但是 allow-origins=* 和 allow-credentials=true 的解决方法是使用表达式:

<allowed-origins>
    <origin>@(context.Request.Headers.GetValueOrDefault("Origin", "*"))</origin>
</allowed-origins>

这种方式响应将包含在 Access-Control-Allow-Origin 中发送的 Origin 标头值,而不仅仅是 * 是不允许的。


推荐阅读