16

私のアプリでは、HTTP から HTTPS への AJAX リクエストを作成しています。これは、CORS が必要であることを意味します。そこで、いくつかのヘッダーとパラメーターを jQuery.ajax に追加してテストします。Firefox ではすべて正常に動作しますが、Chrome では動作しません。Chrome はすべてのプリフライト リクエストを「kill」します (OPTIONS)。

jQuery スクリプト:

$(document).on('click', 'a.ajax', function(e) {
    e.preventDefault();
    $.ajax(this.href, {
        type: 'GET',
        dataType: 'json',
        crossDomain: false,
        headers: {'X-Requested-With': 'XMLHttpRequest'},
        xhrFields: {
            withCredentials: true
        }
    });
    return false;
});

HTTP ダンプ:

> OPTIONS /foo HTTP/1.1
> User-Agent: curl/7.29.0
> Host: local.bar.cz
> Accept: */*
> Access-Control-Request-Headers:accept, origin, x-requested-with
> Access-Control-Request-Method:GET
> Origin:http://local.bar.cz
> 
< HTTP/1.1 204
< Server: nginx/1.2.7
< Date: Wed, 27 Feb 2013 15:06:54 GMT
< Content-Type: text/html; charset=utf-8
< Connection: keep-alive
< X-Powered-By: Nette Framework
< X-Frame-Options: SAMEORIGIN
< Access-Control-Allow-Origin: http://local.bar.cz
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: accept, origin, x-requested-with
< Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
< 

クロムがこのリクエストを殺す理由を知っている人はいますか?

4

3 に答える 3

17

https サーバーに信頼されていない証明書がある可能性があります。その場合は、まずブラウザで URL にアクセスし、信頼できない接続を受け入れてみてください。

于 2013-03-22T08:59:49.610 に答える
12

証明書を受け入れても、常にこの問題が解決するとは限りません。自己署名証明書を使用する場合、最初に同意した場合でも、Chrome は場合によってはプリフライト OPTIONS リクエストをキャンセルします。2011年からこのようになっています:

そのページに記載されている回避策は、システムの信頼できる証明書のリストに自己署名証明書を追加することです。

Mac でこれを行う手順 (OS 10.8.5 http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signedで動作するようにオリジナルから少し変更-ssl-証明書/ ):

  1. アドレスバーで、X が付いた小さな錠前をクリックします。これにより、小さな情報画面が表示されます。
  2. 「証明書情報」というボタンをクリックします。</li>
  3. 証明書の画像をクリックしてデスクトップにドラッグし、ファインダー ウィンドウを開きます (デスクトップにドラッグするのは好きではないようです。
  4. 作成したファイルをダブルクリックします。これにより、キーチェーン アクセス ユーティリティが表示されます。パスワードを入力してロックを解除します。
  5. ログインキーチェーンではなく、システムキーチェーンに証明書を追加してください。これは何もしないように見えますが、「常に信頼する」をクリックします。
  6. 追加したら、ダブルクリックします。再度認証する必要がある場合があります。
  7. 「信頼」セクションを展開します。「この証明書を使用する場合」を「常に信頼する」に設定</li>

証明書が完全に信頼されるようにするには、Chrome を再起動する必要がある場合があります (URL バーのアイコンが幸せな緑色のロックに変わります)。

于 2013-09-27T14:03:53.577 に答える
9

まったく同じように見える結果が得られる別のケースがあることに言及する価値があります。

要求が返されるのを待っている間に (つまり promise を介して) ブラウザーを別の URL (window.location ..) に移動すると、OPTIONS 要求は送信されますが、後続の応答 (POST/GET/*) はキャンセルされます。 (当然..)

はい..もちろん..それを行うとバグになります..しかし、同じように見えて、間違った場所を探すのに何時間もかかる可能性があります。そのようなコードを考えてみましょう:

makeAjaxCallThatReturnsAPromise.then(
    function () { // doSomething },
    function () { // doSomethingElse }
);
location.replace('http://some.where/');
于 2015-12-21T22:55:10.503 に答える