HTTPリクエストがステータスコード0を返すとはどういう意味ですか?


130

フェッチやXMLHttpRequestなどのJavaScriptネットワークコール、またはその他のタイプのHTTPネットワークリクエストがHTTPステータスコード0で失敗するとはどういう意味ですか?

他のコードはHTTP仕様の3桁なので、これは有効なHTTPステータスコードではないようです。

テストとして、ネットワークのプラグを完全に抜いてみました。これは無関係である可能性がありますが、ステータスコード17003(IIRC)になり、ざっと検索すると「DNSサーバーの検索に失敗しました」と表示されます。

同じコードは一部の場所やシステムで正常に機能しますが、特定の環境ではステータスコード0で失敗し、responseTextが提供されません。

これは、インターネットURLへの典型的なHTTP POSTです。私が理解しているfile://が含まれていないため、Firefoxでの成功を示す0が返される場合があります。


ファイアウォールが原因の可能性はありますか?アプリを実行しているクライアントのOSは何ですか?
shahkalpesh 2009年

役に立つかもしれません:stackoverflow.com/a/12622082/386579
shasi kanth 14

関連記事
RBT

私はFirefoxでも同じ問題を抱えていて、広告ブロッカープラグインが単語を含むURLへのすべてのリクエストを阻止していることがわかりましたbanner
Jan

回答:


56

エラーコードは、応答が空であることを示していると思います(ヘッダーも返されなかったため)。これは、接続が受け入れられ、正常に閉じられたことを意味します(TCP FIN)。これを引き起こす可能性のあるものはいくつかありますが、あなたの説明に基づいて、何らかの形のファイアウォールが最も可能性の高い原因であると思われます。


2
あなたはおそらく正しいと思います。(ただし、@ sleepycodで指摘されているように、実際の httpステータスコードがない場合、wininet.dllはいくつかのステータスコードを返すことが期待されます。)
マイクネルソン

1
これは必ずしも正しいとは限りません。同じ問題が発生しましたが、私の場合、リクエストが送信されませんでした。その理由は、Firefoxの広告ブロッカーは、そのURLの単語を含む要求を防ぐことだったbanner

194

ここでの答えの多くは間違っています。 人々は特定のケースでstatus == 0の原因を突き止め、それを答えとして一般化しているようです。

実際には、失敗したXmlHttpRequestのstatus == 0は、未定義のエラーと見なされます。

実際のW3C仕様は、ここでゼロが返される条件を定義しています。https//fetch.spec.whatwg.org/#concept-network-error

仕様(フェッチまたはXmlHttpRequest)からわかるように、このコードは、サーバーに接続する前でも発生したエラーの結果である可能性があります。

このステータスコードを生成する一般的な状況の一部は他の回答に反映されていますが、これらの問題のいずれかまたはまったくない可能性があります。

  1. 不正なクロスオリジン要求(CORSを参照)
  2. ファイアウォールのブロックまたはフィルタリング
  3. リクエスト自体がコードでキャンセルされました
  4. インストールされているブラウザ拡張機能が問題を引き起こしています

ブラウザーがこれらのstatus == 0シナリオの詳細について詳細なエラーレポートを提供すると役立つでしょう。実際、たまにstatus == 0が役立つコンソールメッセージを伴うこともありますが、他の情報がない場合もあります。


4
FirefoxアドオンNoScriptは、信頼できないホストへのXHRリクエストをキャンセルできます。
Ivan Solntsev 2013年

5
+ 1、これはすべて正確であり、「何らかのエラーが発生しました」が実際的な解釈です。仕様に示されている考えられる原因の包括的なリストに関心がある人のために、内訳をstackoverflow.com/a/26451773/1709587に投稿しました。
マークアメリー2014年

1
Mark Ameryによって詳細に説明されているケースの中で、私が最もトラブルを引き起こしているのは、corsケースです。エラーが原因で応答がcors検証に失敗した場合、cors検証が失敗すると応答にアクセスできないため、httpステータスではなく0ステータスが返されます。メンテナンス中のWeb APIを検出して503に応答するときに特にイライラします。メンテナンス中にこのAPIがcorsを尊重しない場合、503を検出できなくなり、他の多くの原因によって0が発生します。事。
フレデリック

私が直面したCORSの問題:ページが最初に読み込まれた場合や、その逆httphttps場合の代わりに使用することを検討してくださいhttp。別の言葉では、Ajaxを行わないPOST経由でhttpsあなたのページを経由してアクセスした場合httpとAjaxを実行しませんPOST経由でhttp自分のページがinitiallly経由でアクセスした場合https
Victor Ponamarev 2016年

同期リクエストが0ステータスでより意味のある例外をスローする:stackoverflow.com/a/49573256/1192811
McX

35

ブラウザーに応じて、jQueryベースのAJAX呼び出しはHTTPステータスコード0で成功コールバックを呼び出します。ステータスコード「0」は通常、ユーザーが前に別のページに移動したことを意味しますAJAX呼び出しが完了しました。

使用しているものと同じテクノロジースタックではありませんが、誰かに役立つことを期待しています。


はい、このページには10,000回のビューがあったため、おそらくこの問題は多く発生します。
マイクネルソン、2010

それとも25,000回のビューと言ったほうがいいですか?
マイクネルソン、

3
それは多くの価値があります:それは私の自動化されたテストで正確に失敗したものです。どうもありがとう!
alexfernandez

これは「正しい」答えなので、賛成票を投じられませんでしたが、私の場合はそれが起こっていました。
ファンメンデス

これは間違いなく発生しますが、エラーコード== 0が表示される唯一の理由ではありません。そのユーザーだけが移動していると想定して、このタイプのエラーメッセージを除外することはできません。
wal 2014年

14

wininet.dll 以下に示す標準および非標準の両方のステータスコードを返します。

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

ステータスコード「0」の場合、Webサーバー上で実行されている、またはWebサーバーなしで実行されているローカルWebページでリクエストを実行しようとしていますか?

XMLHttpRequest status = 0およびXMLHttpRequest statusText = unknownは、Webサーバーでスクリプトを実行していない場合に役立ちます。


コードをありがとう。いいえ、これはローカルリクエストではなく、ローカルで実行されているvbscriptからのインターネット上のWebサーバーへのリクエストです。
マイクネルソン

6

回避策:最終的に何をしたか

ファイアウォールの問題が原因であると考えたため、この問題を回避するための回避策を考え出しました。誰かがこれと同じ問題を抱えている場合、私たちがしたことは次のとおりです:

  1. 以前と同じように、HTAを使用して、データをローカルハードディスク上のテキストファイルに書き込みます。

  2. ユーザーが[サーバーにデータを送信]をクリックすると、HTAはデータを読み取り、そのデータを含むHTMLページをXMLデータアイランドとして(実際にはSCRIPT LANGUAGE = XMLスクリプトブロックを使用して)書き出します。

  3. HTAは、ブラウザーでHTMLページへのリンクを起動します。

  4. HTMLページには、サーバーにデータを投稿するJavaScriptが含まれています(Microsoft.XMLHTTPを使用)。

これが同様の要件を持つ人を助けることを願っています。この場合、展示会のラップトップで使用されているFlashゲームでした。このトレードショーは別の国で開催されていたため、私たちはラップトップにアクセスすることはなく、クライアントにメールで送信することしかできませんでした。


こんにちは私は生産で顧客に発生している同様の問題を調査しています。あなたは問題がファイアウォールによって引き起こされたと言います。ファイアウォールによって何が発生したか、またはファイアウォールが何を発生させたかを覚えていますか?
イブラヒムナジャール

5

HTTP応答コード0は、AJAX要求がキャンセルされたことを示します。

これは、タイムアウト、XHR中絶、またはファイアウォールがリクエストを踏むことから発生します。タイムアウトは一般的です。これは、リクエストが指定時間内に実行に失敗したことを意味します。XHR Abortionの実行は非常に簡単です。実際には、XMLHttpRequestオブジェクトで.abort()を呼び出して、AJAX呼び出しをキャンセルできます。(これは、AJAX呼び出しが返されて破棄されたオブジェクトを参照しようとしないようにする場合、単一ページアプリケーションの良い方法です。)マークされた回答で述べたように、ファイアウォールは要求をキャンセルしてこれをトリガーすることもできます。応答なし。

XHR Abort:jQueryを使用してAjaxリクエストを中止する

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()

XHRオブジェクトで.abort()メソッドを実行すると、エラーコールバックも発生することに注意してください。これらのオブジェクトを解析するあらゆる種類のエラー処理を実行している場合、中止されたXHRとタイムアウトXHRは同じであることがすぐにわかりますが、jQueryでは、エラーコールバックに渡されるtextStatusが中止されたときに「中止」されますタイムアウトを伴う「タイムアウト」が発生します。Zeptoを使用している場合(jQueryに非常によく似ています)、中断するとerrorTypeは「エラー」になり、タイムアウトが発生すると「タイムアウト」になります。

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);

4

このページのこの回答で詳しく説明されているように、ステータスコード0はリクエストが何らかの理由で失敗したことを意味し、JavaScriptライブラリは失敗をステータスコード0として解釈しました。

これをテストするには、次のいずれかを実行できます。

1)このChrome拡張機能、Requestlyを使用して、URLのhttpsバージョンからバージョンにURLをリダイレクトします。httpこれにより、混合コンテンツのセキュリティエラーが発生し、最終的にステータスコード0が生成されます。このアプローチの利点は、アプリをまったく変更する必要はなく、この拡張機能を使用してURLを単純に「書き換え」ることができます。

2)アプリのコードを変更して、オプションでエンドポイントをhttpバージョンではなくバージョンにリダイレクトしますhttps(またはその逆)。これを行うと、リクエストはステータスコード0で失敗します。


1
「このクロム拡張を使用する」—クロム拡張ですか?HTAアプリケーションでは?
クエンティン

4
確かに良い点!しかし、ここに到着するほとんどの人はHTAアプリケーションのためにここに来ていません。彼らは "javascript http status code 0"かそのようなものをググって、ここに到着している-だから私はこの質問のHTAの部分は全体的に最も重要性が低く、結局これはまだ関連性があると思う。
Brad Parks

2

私の場合、ドメインの前にWWWを置くのを忘れると、ステータスが0になりました。私のすべてのajaxリクエストはhttp:/WWW.mydomain.comにハードコードされており、読み込まれるWebページはhttp://mydomain.comになるだけなので、ドメインが異なるためにセキュリティ上の問題が発生しました。常にwwwを前に置くために、.htaccessファイルでリダイレクトを実行することになりました。


1

私の場合は、同じ生成元のポリシーが原因で、AJAX呼び出しがブラウザによってブロックされていたためです。すべてのHTMLとスクリプトがから提供されるため、これは最も予期されていなかったものでした127.0.0.1。彼らはどのようにして異なる起源を持つと見なすことができますか?

とにかく、根本的な原因は無邪気に見える<base>タグでした:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

<base>ちなみに不要だったタグを外してみましたが正常に動作します!


1

文書化されていない、新しいステータス== 0の理由を発見しました。

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

クロスオリジン、ネットワーク、またはキャンセルされたリクエスト(コードまたはユーザーナビゲーションによる)によるものではありませんでした。開発者コンソールまたはネットワークログには何もありません。

私はstate()に関するドキュメントをほとんど見つけることができず(Mozillaはそれをリストしませんが、W3Cはリストします)、どれも「拒否された」と述べていません。

それは私の広告ブロッカー(FirefoxのuBlock Origin)であることがわかりました。


1

Leeの回答に加えて、例外も発生するため、同期リクエストに切り替えることで、実際の原因に関する詳細情報を見つけることができます。

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

例えば ​​:

NetworkError:ネットワークエラーが発生しました。


0

他の誰かがこの問題に遭遇した場合、AJAXリクエストと通常のフォームリクエストが送信されたために問題が発生していました。私は次の行でそれを解決しました:

<form onsubmit="submitfunc(); return false;">

ここでのキーは、フォームが送信されない原因となるfalseを返すことです。また、submitfunc()の内部からfalseを返すこともできますが、明確に書いてあることがわかります。


1
「デフォルトの防止」もこれに対して機能します。これは、イベント発生時にブラウザがデフォルトの動作を実行しないようにするJavaScript関数であり、ネイティブ機能をきちんとオーバーライド/防止できます... falseを返すのも同じことです。
Cory Danielson 2012

0

client_max_body_sizenginx のディレクティブを超えるajaxファイルをアップロードすると、このエラーコードが返されることに注意してください。


0

ローカルPCでテストしている場合、機能しません。Ajaxの例をテストするには、HTMLファイルをWebサーバーに配置する必要があります。


0

私の場合、HTTPプロトコルでリクエストされたページでエラーが発生し、その内部のJavaScriptがHTTPSリクエストを実行しようとしました。およびその逆。

ページの読み込み後、F12(またはCtrl + U)を押して、ページのHTMLコードを確認します。コードにそのようなものが表示された場合:

<!-- javascript request inside the page -->
<script>
var ajaxurl = "https://example.com/wp-admin/admin-ajax.php";
(...)
</script>

そしてあなたのページはこのように要求されました:

http://example.com/example-page/2019/09/13/my-post/#elf_l1_Lw

あなたは確かにこのエラーに直面するでしょう。

これを修正するには、Javascript要求のプロトコルをページ要求のプロトコルと同じに設定します。

ページとjsリクエストの異なるプロトコルが関係するこの状況は、Brad Parksの回答で以前に述べられましたが、ここで提示された診断手法は、大多数のユーザーにとってはより簡単だと思います。

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