4

私の AngularJS アプリケーションは、当社のサービス (Jetty を利用) に対して多くの AJAX リクエストを実行しています。何らかの理由で、一部のユーザーにのみ次のエラーが発生し、ブラウザーのキャッシュをクリアするように求められると消えます。これは Google Chrome でのみ発生します

www.domain.com で api.domain.com をリクエストしようとしています。

XMLHttpRequest はhttp://api.domain.com/my-serviceを読み込めません。リクエストは「 https://api.domain.com/my-service 」にリダイレクトされました。これは、プリフライトを必要とするクロスオリジン リクエストでは許可されていません。/現在のページ

Chrome がサービスを HTTP から HTTPS にリダイレクトしようとしていることに注意してください。私のウェブサイトは HTTP または HTTPS 経由でアクセスできます

chrome://net-internals/#events の出力は次のとおりです。

1523417: URL_REQUEST
http://api.domain.com/my-service
Start Time: 2014-08-15 14:17:39.809

t=5984 [st= 0] +REQUEST_ALIVE  [dt=26]
t=5984 [st= 0]   +URL_REQUEST_DELEGATE  [dt=0]
t=5984 [st= 0]      DELEGATE_INFO  [dt=0]
                    --> delegate_info = "extension AdBlock"
t=5984 [st= 0]      DELEGATE_INFO  [dt=0]
                    --> delegate_info = "extension AdBlock"
t=5984 [st= 0]   -URL_REQUEST_DELEGATE
t=5984 [st= 0]   +URL_REQUEST_START_JOB  [dt=26]
                  --> load_flags = 143540480 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT)
                  --> method = "OPTIONS"
                  --> priority = "LOW"
                  --> url = "http://api.domain.com/my-service"
t=5984 [st= 0]      URL_REQUEST_REDIRECT_JOB
                    --> reason = "HSTS"
t=5985 [st= 1]     +URL_REQUEST_DELEGATE  [dt=25]
t=5985 [st= 1]        DELEGATE_INFO  [dt=25]
                      --> delegate_info = "AsyncResourceHandler"
t=6010 [st=26]     -URL_REQUEST_DELEGATE
t=6010 [st=26]      CANCELLED
t=6010 [st=26]   -URL_REQUEST_START_JOB
                  --> net_error = -3 (ERR_ABORTED)
t=6010 [st=26]    URL_REQUEST_DELEGATE  [dt=0]
t=6010 [st=26] -REQUEST_ALIVE

Chromeがそのようなリダイレクトを強制する理由は何ですか? ネットワーク タブに問題はありません。その要求に対して何も戻ってきません。

より詳しい情報:

これは、動作中の Chrome ブラウザーの応答ヘッダーです。

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:X-Requested-With, authorization, content-type, X-CSRF-Token
Access-Control-Allow-Methods:GET, POST, HEAD, PUT, OPTIONS
Access-Control-Allow-Origin:http://api.domain.com
Content-Length:0
Server:Jetty(8.y.z-SNAPSHOT)
4

1 に答える 1

3

これは、どこでも HTTPS などの拡張機能や Strict Transport Security (HSTS) が原因である可能性があります。

これらの要因は制御できません。解決するには、CORS 応答ヘッダーを提供するようにサーバー側の API エンドポイントを変更する必要があります。

Access-Control-Allow-Origin: http://api.domain.com

...または単に https をサイドワイドに強制します。そうすれば、http/https オリジン違反について心配する必要はありません。おまけとして、https は最近、Google でのサイトのランキングにとってプラスの要因の 1 つになりました。


質問のログは、HSTS が原因であることを明確に示しています。Chrome の HSTS 実装は、現時点ではクロスオリジン リクエストで適切に動作しません ( crbug.com/387198 )。Web サイトの所有者がこのバグを回避する唯一の方法は、サイドワイド https を強制し、https 経由で API にアクセスすることです。

バグを再現したい場合はchrome://net-internals/#hsts、最初の入力ボックス (「ドメインの追加」) を使用してドメインを HSTS リストに追加します。次に、バグを再現した後、2 番目の入力ボックス (「ドメインの削除」) を使用して HSTS リストからドメインを削除します。この方法は、ユーザーがバグを回避する方法でもあります。結局、ドメインが HSTS リストから削除されると、HSTS リダイレクトはなくなります。

HSTSとは?
HSTS は、サーバーが https 応答のいずれかで Strict-Transport-Security ヘッダーを送信した後にアクティブ化されます。このヘッダーを一度受信すると、ブラウザーは Web ページ上のすべてのリソースが https 経由で要求されるように強制します。詳細については、http://chromium.org/stsおよびhttp://en.wikipedia.org/wiki/HTTP_Strict_Transport_Securityを参照してください。

このバグは一部のユーザーにのみ発生するため、ブラウザーの拡張機能または STS ヘッダーで応答する API ドメイン上のページが原因である可能性が最も高いです。

于 2014-08-15T12:30:49.113 に答える