1

で動作するWebサービスがありますGET。このWebサービスにアクセスするには、いくつかのカスタムヘッダーを渡す必要があります。

メソッドを使用してJavaScriptコードからWebサービスにアクセスしようとするとGET、リクエストメソッドがに変更されOPTIONSます。(ドメインが異なります)

いくつかの記事を読んで、カスタムヘッダーを使用したリクエストがプリフライトされ、その場合、実際のメソッド呼び出しの前に、OPTIONSメソッドを使用したリクエストがサーバーに対して行われることを確認しました。

しかし、私の問題は、OPTIONS呼び出し後、実際のメソッド(つまりGET)が呼び出されていないことです。

OPTIONS呼び出しはステータスを401として返しています。

これは、私のWebサービスがサポートしているGETだけだからではないかと思います。どうすれば問題を解決できますか?親切に助けてください。(私のコードはIEで正常に動作しますが、Chromeなどの他のブラウザーでは動作しません)

4

1 に答える 1

4

チェックする2つのこと(サーバー側の言語/テクニックが何であるかはわかりません):

  1. OPTIONSに有効なメソッドとして含めていますAccess-Control-Allow-Methodsか? 例:

    Access-Control-Allow-Methods: GET, OPTIONS
    
  2. リクエストが送信するカスタム ヘッダーは、許可されたものとしてブラウザに返されていますか? 例:

    Access-Control-Allow-Headers: X-PINGOTHER 
    

リモート サーバーは、安全な標準準拠のブラウザー (IE の古いバージョンではない) が発信元以外の応答を許可する前に、これらの両方 (および最も確実に 2 番目のブラウザー) を返す必要があります。

したがって、これを HTTP サーバー レベルで実装し、Web サービスの移植性を維持したい場合は、次のことを試してください。

Web サービスの URL はhttp://example.org/serviceであり、サービスへのパスは/srv/www/service

Apache 2.0 を実行している場合、ヘッダーを追加する構文は です。2.2addでは、 を使用しますset

したがって、次のように変更/srv/www/service/.htaccessします。

 Header set Access-Control-Allow-Methods "GET, OPTIONS"
 Header set Access-Control-Allow-Headers "X-MY_CUSTOM_HEADER1,X-MY_CUSTOM_HEADER2"
 Header set Access-Control-Allow-Origin "*"

もちろん、mod_headers上記が機能するためには Apache モジュールがオンになっている必要があります。Access-Control-Allow-Credentials: trueまた、allow-origin をワイルド カードに設定するのは危険であり、ヘッダーを送信している場合、実際にはリクエストが失敗する原因になります(その場合、ワイルド カードは使用できません)。また、SetEnvIfApache の mod を使用すると、htaccess ファイルを微調整して、そのディレクトリへのすべてのリクエストではなく、適切な場合にのみヘッダーを返すことができます。

于 2012-04-25T11:06:44.303 に答える