4

API プロキシを作成し、「API のダイレクト ブラウザー アクセスを有効にする — CORS を介したブラウザーからのダイレクト リクエストを許可する」というボックスをオンにします。しかし、私の OPTIONS リクエストはまだ失敗しています:

{
    "fault": {
        "faultstring": "Received 405 Response without Allow Header",
        "detail": {
            "errorcode": "protocol.http.Response405WithoutAllowHeader"
        }
    }
}

CORSプリフライトオプションリクエストについて私が理解していることから、クライアントは最初にOPTIONSリクエストをサーバーに送信し、「安全な」CORSを保護します。このリクエストは、利用可能なリクエスト タイプのリストを含むレスポンスを返す必要があります。

私の質問: Apigee が OPTIONS リクエストに正しく応答し、プロキシの背後にある API に OPTIONS リクエストを渡さないようにするにはどうすればよいですか? . それが役立つ場合、AngularJS JavaScript アプリが Apigee エンドポイントと通信しようとしています。

Javascript エラー:

OPTIONS http://api.example.com No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://client.example.com' is therefore not allowed access.

XMLHttpRequest cannot load http://api.example.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://client.example.com' is therefore not allowed access. 

デフォルトの「CORS の追加」xml

<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>

デフォルトのプロキシ エンドポイント xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <Flows/>
    <PreFlow name="PreFlow">
        <Request/>
        <Response/>
    </PreFlow>
    <HTTPProxyConnection>
        <BasePath>/v1/cnc</BasePath>
        <VirtualHost>default</VirtualHost>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
    </RouteRule>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
</ProxyEndpoint>

デフォルトのターゲット エンドポイント xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TargetEndpoint name="default">
    <Description/>
    <Flows/>
    <PreFlow name="PreFlow">
        <Request/>
        <Response>
            <Step>
                <Name>Add-CORS</Name>
            </Step>
        </Response>
    </PreFlow>
    <HTTPTargetConnection>
        <URL>http://api.example.com/v1/assets.json</URL>
    </HTTPTargetConnection>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
</TargetEndpoint>
4

2 に答える 2

7

OPTIONS リクエストをバックエンド API に渡したくないので、次の 2 つのことが必要です。

  1. OPTIONS リクエストの条件付きの null ターゲットへの RouteRule。TargetEndpoint が指定されていないことに注意してください。

    <RouteRule name="NoRoute">
        <Condition>request.verb == "OPTIONS"</Condition>
    </RouteRule>
    
  2. CORS 応答を処理するための ProxyEndpoint のカスタム フロー。新しい RouteRule はメッセージを null ターゲットに送信するため (リクエストをクライアントにエコーバックする)、メッセージは CORS ポリシーが現在定義されている「デフォルト」の TargetEndpoint にルーティングされません。

ProxyEndpoint の更新バージョンは次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <Flows>
        <Flow name="OptionsPreFlight">
            <Request/>
            <Response>
                <Step>
                    <Name>Add-CORS</Name>
                </Step>
            </Response>
        <Condition>request.verb == "OPTIONS"</Condition> 
        </Flow>
    </Flows>
    <PreFlow name="PreFlow">
        <Request/>
        <Response/>
    </PreFlow>
    <HTTPProxyConnection>
        <BasePath>/v1/cnc</BasePath>
        <VirtualHost>default</VirtualHost>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="NoRoute">
        <Condition>request.verb == "OPTIONS"</Condition>
    </RouteRule>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
   </RouteRule>
   <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
</ProxyEndpoint>

注: RouteRules は、ProxyEnpoint 構成で指定された順序で評価されます。最後に常にデフォルト (条件なし) のルートが必要です。それ以外の場合、上部にある場合は常に一致し、他のルートの可能性を評価することはありません。

于 2014-01-17T21:24:12.400 に答える