AJAXがHTTPステータスコード0を返すのはなぜですか?


回答:


110

別のケース:

AJAX呼び出しを送信し、AJAX応答を取得する前にブラウザの更新がトリガーされた0場合、ステータスコードを取得することが可能です。AJAX呼び出しはキャンセルされ、このステータスが表示されます。


9
これを指摘してくれてありがとう、私はフォーム送信がajax呼び出しをキャンセルできること(そしてブラウザの更新)に気づきました。
Magnus Smith 14

1
ただ、やる<form onsubmit="return false;">
Heitor

1
@Heitorの提案は私にとってうまくいきました-フォームの「送信」ボタンがページを更新していましたが、「送信」ボタンがクリックされたときにJavaScriptがajax呼び出しを実行しようとしていました。その結果、ajax呼び出しがキャンセルされました
Nic Sc​​ozzaro

ねえ、私は逃したe.preventDefault();
SparK

97

私の経験では、次の場合にステータス0が表示されます。

  • クロスサイトスクリプティングの実行(アクセスが拒否された場合)
  • 到達できないURLのリクエスト(タイプミス、DNSの問題など)
  • リクエストが他の方法で傍受された(広告ブロッカーを確認してください)
  • 上記のように、リクエストが中断された場合(ブラウザがページから移動します)

1
接続が拒否されたときに取得します。たとえば、Visual Studioを使用してサイトをデバッグしているときに、デバッグセッションを停止した場合、接続を試みたリクエストはnet :: ERR_CONNECTION_REFUSEDを取得し、ステータスコードはゼロになります。ステータスコードを提供することになっているサーバーに接続できない場合、ステータスコードを取得できないため、これは理にかなっています。
Triynko

確認できます。Webサーバーをシャットダウンした後、status == 0になりました。
9ilsdx 9rvj 0lo

「クロスサイトスクリプティング」が原因でエラーが発生します。私は何をすべきか?

1
@nasimjahednia lookup CORS ...アクセスしようとしているサーバーは、ドメインからのクロスサイトスクリプティングを許可する必要があります。
Langdon

よくわかりません。HTTPエラーコードを返す方法はありませんか?これは、ここでは多くの異なるケース(415、404など?)です
エドウィンエバンス

8

を使用する場合のここでの同じ問題<button onclick="">submit</button>。次に、使用して解決しました<input type="button" onclick="">


1
ビンゴ!!誰もがなぜこれを説明できますか?
ホルヘ

3
デフォルトでは、HTMLボタンタイプは「送信」であるため、クリックするとフォームデータの送信が試行されます。したがって、クリックアクションを実行し、送信を試みます。タイプ「ボタン」を使用すると、デフォルトのタイプではなくなり、onclickのみが実行されます。
クリストフ・ルシー2017年

7

ステータスコード0は、リクエストされたURLに到達できないことを意味します。変更することで//何か/何かます:httpのhttps://何か/何かが私のために働きました。ステータスコードが0の場合、IEは「許可が拒否されました」というエラーをスローしますが、他のブラウザはそうしません。


この場合、Chromeは現在、タイムアウトするまでリクエストを「ストール」状態のままにします。これは、そのサーバーからの以前の要求で返されたStrict-Transport-Securityフラグ、または要求と共に送信されているCookieのSecure / HttpOnlyフラグが原因である可能性があります。
シェーンヒューズ

7

ajax呼び出しは、wwwで始まる特定のドメインを持つcookieで定義されたセッション内でも失敗する可能性があることに注意してください。次に、たとえばwwwなしでphpスクリプトを呼び出します。URLにプレフィックスを付けると、呼び出しは失敗し、逆も同様です。


4

この記事は私を助けました。私はAJAX経由でフォームを送信していましたが、return false(私のajaxリクエストの後に)使用するのを忘れていたため、クラシックなフォームが送信されましたが、不思議なことに完了しませんでした。


夜明けこれまた捕まえられた事実嫌い!<form onsubmit="return false;">トリックをしました。
Heitor

3

これはgoogle ajaxステータス0を表示したときに表示されるので、何時間も無駄に費やしただけのヒントを残したいと思いました... ajaxを使用して、偶然にCodeigniterのPhilのREST_ControllerであるPHPサービスを呼び出していました(これがあるかどうかはわかりません)それと関係があるかどうかにかかわらず)、ステータス0、readystate 0を取得し続け、それは私を混乱させていました。私はそれをデバッグしていて、メッセージを終了する代わりにエコーして戻ると、成功することに気づきました。最後に、デバッグをオフにして試しましたが、うまくいきました。PHPを使用するxDebugデバッガーが応答を変更しているようです。PHPデバッガーを使用している場合は、それをオフにして、効果があるかどうかを確認してください。


3

jqueryがステータスコード0を返す別のケースを見つけました-何らかの理由でXMLHttpRequestが定義されていない場合、このエラーが発生します。

明らかにこれは通常Webでは発生しませんが、Firefoxの毎晩のビルドのバグにより、私が書いていたアドオンでこれが発生しました。:)


1
jQuery.ajax()おっしゃったとおり、XHRオブジェクトに問題がありました。リクエストはAJAX呼び出しでも作成されませんでしたが、それでもf.openは関数ではなく、ステータスコード0を取得します。原因:$.ajaxSettings.xhrからオブジェクトを$.ajaxSetup({xhr})返していましたが、new window.XMLHttpRequest();代わりに問題を解決しました
klimpond


2

「偶発的な」フォームの送信は、まさに私が抱えていた問題でした。FORMタグを完全に削除したところ、問題が解決したようです。みなさんありがとう!


2

同様の問題(jquery ajax呼び出しのステータスコード0)があり、診断に1日かかりました。この理由についてはまだ誰も触れていなかったので、共有します。

私たちの場合、問題はHTTPサーバーのクラッシュでした。PHPのいくつかのバグがApacheを破壊していたため、クライアント側では次のようになりました。

mirek@toccata:~$ telnet our.server.com 80
Trying 180.153.xxx.xxx...
Connected to our.server.com.
Escape character is '^]'.
GET /test.php HTTP/1.0
Host: our.server.com

Connection closed by foreign host.
mirek@toccata:~$ 

test.phpにはクラッシュするコードが含まれています。サーバーから返されるデータはありません(ヘッダーも含まれません)=> ajax呼び出しはステータス0で中止されました


2

私の場合、それは私のdjangoサーバーを実行してhttp://127.0.0.1:8000/いるがajax呼び出しをに送信したことが原因でしたhttp://localhost:8000/。それらが同じアドレスにマップすることを期待するとしても、ローカルホストにリクエストを送信していないことを確認してください。


2

今回のケースでは、ページのリンクがhttpsからhttpに変更されました。ユーザーがログインしていても、AJAXでのロードが阻止されていました。


面白い。私の場合は願っています。私のiframeがhttpsで開くので、結果としてajaxをhttpに送信すると、ステータス0
sonic

1

私の場合、url: ''ajax設定で設定すると、IE8でステータスコード0になります。つまり、IEはそのような設定を許容しないようです。


1

私にとっての問題は、ホスティング会社(Godaddy)が、実質的な応答データ(数十キロバイトを超えるもの)を含むPOST操作を、ある種のセキュリティの脅威として扱うことによって引き起こされました。これらのうち6つを超えるものが1分間に発生した場合、ホストは次の1分間にPOSTリクエストに応答するPHPコードの実行を拒否しました。ホストが代わりに何をしたかは完全にはわかりませんが、tcpdumpで、ブラウザーからのPOST要求への応答として送信されるTCPリセットパケットを確認しました。これにより、jqXHRオブジェクトで返されるhttpステータスコードが0になりました。

操作をPOSTからGETに変更すると、問題が修正されました。Godaddyがこの制限を課す理由は明らかではありませんが、コードを変更する方がホストを変更するよりも簡単でした。


1

このエラーの原因を知っていると思います。

Google Chromeには、Google Chrome拡張機能に対するDDOS攻撃を防ぐための組み込み機能があります。

ajaxリクエストが継続的に500以上のステータスエラーを返すと、リクエストの抑制が始まります。

したがって、次の要求でステータス0を受け取ることが可能です。


1

説明されている問題の最も馬鹿げた理由で賞を獲得しようとしました。

電話を忘れる

xmlhttp.send(); //yes, you need this pivotal line!

はい、まだ「オープン」コールからゼロのステータスリターンを受け取っていました。


1

私の場合、これはSafari Mobileでしか得られませんでした。問題は、相対URL (whatever.php)ではなく完全なURL(http://example.com/whatever.php)を使用していたことです。これは意味がありませんが、私のサイトはhttp://example.comでホストされているため、XSSの問題になることはありません。Safariはhttpの部分を調べ、残りのURLを検査せずに、安全でない要求として自動的にフラグを立てると思います。


1

私のトラブルシューティングで、このAJAX xmlhttpRequest.status == 0は、クライアント呼び出しがまだサーバーに到達していないが、クライアント側の問題が原因で失敗したことを意味する可能性があることを発見しました。応答がサーバーからのものであった場合、ステータスは1xx / 2xx / 3xx / 4xx / 5xx HTTP応答コードのいずれかである必要があります。今後、トラブルシューティングはクライアントの問題に焦点を当てる必要があり、インターネットネットワーク接続のダウン、または上記の@Langdonで説明されているもののいずれかである可能性があります。


0

リクエストの作成中にブラウザのコンソールを確認します。「同じオリジンポリシーにより、http ajaxでリモートリソースを読み取ることができません...理由:corsヘッダー 'access-control-allow-origin'がありません」と表示される場合は、応答ヘッダーに「Access-Control-Allow-Origin」を追加します。exa:Javaでは、response.setHeader( "Access-Control-Allow-Origin"、 "*")のように設定できます。ここで、responseはHttpServletResponseです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.