【问题标题】:Apigee OPTIONS 404Apigee 选项 404
【发布时间】:2014-02-02 00:02:47
【问题描述】:

我对 Apigee 的 CORS 支持感到困惑。我设置了一个新代理,并确保勾选“为您的 API 启用直接浏览器访问 - 允许通过 CORS 来自浏览器的直接请求”。盒子。

似乎 CORS 正在处理正常的 GET 请求,但是未找到飞行前 OPTIONS 请求并返回 404。我找到了这个 answer 但无法解决我的问题,因为它看起来像一个不同的可能有问题?

我想回答的主要问题是如何为所有请求设置 Access-Control-Allow-Origin=*?甚至是 OPTIONS 请求?

代理端点

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <Flows>
        <Flow name="Forecast">
            <Description/>
            <Request/>
            <Response/>
            <Condition>(proxy.pathsuffix MatchesPath &quot;/forecast&quot;) and (request.verb = &quot;GET&quot;)</Condition>
        </Flow>
    </Flows>
    <PreFlow name="PreFlow">
        <Request/>
        <Response/>
    </PreFlow>
    <HTTPProxyConnection>
        <BasePath>/v1/weather</BasePath>
        <VirtualHost>default</VirtualHost>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
    </RouteRule>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
</ProxyEndpoint>

目标端点

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TargetEndpoint name="default">
    <Description/>
    <Flows>
        <Flow name="OptionsCORS">
            <Description/>
            <Request/>
            <Response>
                <Step>
                    <Name>CrossOriginResourceSharing</Name>
                </Step>
            </Response>
            <Condition>request.verb equals "OPTIONS"</Condition>
        </Flow>
    </Flows>
    <PreFlow name="PreFlow">
        <Request/>
        <Response>
            <Step>
                <Name>CrossOriginResourceSharing</Name>
            </Step>
        </Response>
    </PreFlow>
    <HTTPTargetConnection>
        <URL>https://home.nest.com/api/0.1/weather</URL>
    </HTTPTargetConnection>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
</TargetEndpoint>

添加 CORS 文件

<AssignMessage async="false" continueOnError="false" enabled="true" name="CrossOriginResourceSharing">
    <DisplayName>Add CORS</DisplayName>
    <FaultRules/>
    <Properties/>
    <Add>
        <Headers>
            <Header name="Access-Control-Allow-Origin">*</Header>
            <Header name="Access-Control-Allow-Headers">origin, x-requested-with, accept</Header>
            <Header name="Access-Control-Max-Age">3628800</Header>
            <Header name="Access-Control-Allow-Methods">GET, PUT, POST, DELETE, OPTIONS</Header>
        </Headers>
    </Add>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

以防万一 - 以下是我在执行请求时遇到的错误。我正在使用 Chrome 并有一个 AngularJS 应用程序。我也能够使用 cURL 语句复制该问题 ( curl -H "Origin: localhost" --verbose http://*********-prod.apigee.net/v1/weather/forecast/12345 -X OPTIONS )

{
    "url": "/api/0.1/weather/forecast/73013",
    "message": "404 Not Found"
}

谢谢!

【问题讨论】:

    标签: cross-domain cors apigee


    【解决方案1】:

    在您的 proxy.xml 中,您再添加一个特定于 OPTIONS 的流程

    <Flow name="OPTIONS">
       <Description>This flow is for client side applications</Description>
          <Response>
             <Step>
                <Name>CORSResponse</Name>
             </Step>
          </Response>
       <Condition>(request.verb = &quot;OPTIONS&quot;)</Condition>
       <Request/>
    </Flow>
    

    现在 CORSResponse.xml 策略可以如下所示

    <AssignMessage name="CORSResponse">
        <AssignTo type="response" createNew="true" />
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    
        <Set>
            <Headers>
                <Header name="Access-Control-Allow-Origin">yourdomain.com</Header>
                <Header name="Access-Control-Allow-Headers">origin, x-requested-with, x-source-ip, Accept, Authorization, User-Agent, Host, Accept-Language, Location, Referer</Header>
                <Header name="Access-Control-Allow-Methods">GET, POST</Header>
            </Headers>
            <StatusCode>200</StatusCode>
        </Set>
    
    </AssignMessage>
    

    【讨论】:

    • 感谢@santanu-dey 的回复。我退后一步,意识到我收到的 404 来自我的端点。在这一点上,我对 CORS 的了解仍然有限,所以我想知道是否需要阻止 OPTIONS 请求甚至通过端点并返回带有 StatusCode 200 的 Access-Control-Allow-Origin。这就是 应该与您发布的信息有关吗?
    • 我对CORS preflight的理解是,CORS preflight指定了它愿意处理什么样的跨域请求。这样浏览器/客户端就不会发送意外/不安全的请求。它就像一个协议的东西,与服务器端的实际服务逻辑/内容无关。因此,在进入任何其他逻辑之前,最好在 apiproxy 中预先处理 OPTIONS 调用。
    • 当我插入你建议的代码时,我收到了这个 405 响应:{ "fault": { "faultstring": "Received 405 Response without Allow Header", "detail": { "errorcode": "协议.http.Response405WithoutAllowHeader" } } }
    • 当您的后端发送没有 Alllow 标头的 405 响应时,Apigee 会引发该错误(符合 HTTP 规范)。因此,您的 OPTIONS 呼叫可能一直传递到您的后端。尝试将请求路径本身中的策略附加到短路。喜欢 CORSResponse
    【解决方案2】:

    解决方案是添加一个 RouteRule,以阻止请求通过 OPTIONS 请求传递到我的 API。

    <RouteRule name="NoRoute">
        <Condition>request.verb == "OPTIONS"</Condition>
    </RouteRule>
    

    另外,我添加了一个向响应添加 CORS 支持的流

    <Flow name="OptionsPreFlight">
        <Request/>
            <Response>
                <Step>
                    <Name>Add-CORS</Name>
                </Step>
            </Response>
        <Condition>request.verb == "OPTIONS"</Condition>
    </Flow>
    

    还有我的最终 Add-CORS 政策

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Add-CORS">
        <DisplayName>Add CORS</DisplayName>
        <FaultRules/>
        <Properties/>
        <Add>
            <Headers>
                <Header name="Access-Control-Allow-Origin">*</Header>
                <Header name="Access-Control-Allow-Headers">origin, x-requested-with, accept</Header>
                <Header name="Access-Control-Max-Age">3628800</Header>
                <Header name="Access-Control-Allow-Methods">GET, PUT, POST, DELETE</Header>
            </Headers>
        </Add>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="response"/>
    </AssignMessage>
    

    【讨论】:

    猜你喜欢
    • 2014-02-07
    • 2014-10-02
    • 1970-01-01
    • 2014-10-22
    • 2017-10-08
    • 2019-05-09
    • 1970-01-01
    • 2018-10-17
    • 2017-04-15
    相关资源
    最近更新 更多