web-dev-qa-db-ja.com

HTTP403:FORBIDDEN-サーバーはリクエストを理解しましたが、実行を拒否しています

AJAX APIの呼び出しを実行すると、上記の403エラーが発生し続けます。

このエラーはMicrosoft Edgeで発生しますが、IE、Chrome、FirefoxまたはSafariでは発生しません。

必要な.LESSファイルをページが見つけられなかったことが原因である可能性があることを読んだので、ページはブートストラップを使用していません。 bootstrapを含めて、問題が解決したかどうかを確認しようとしました-解決しませんでした。

これをググるだけでは何も見つけられないようです。TwitterOauth stuffとbootstrapのように答えます-どちらもありません私のアプリケーションには関係ありません。

前に述べたように、AJAX呼び出しはEdgeを除くすべてのブラウザーで正常に機能します。コードはさまざまなブラウザー間でまったく同じであり、応答/要求ヘッダーは互いに一致します-そうではありませんPOSTリクエストが不正なデータを送信している場合(ブラウザのデフォルトが異なる場合など)。

これは私が達成しようとしていることです:

index.htmlには、4つのiFrameハウジング広告が含まれています。次に、JavaScriptコードがiFrameタグを取得し、ユーザーがその広告にフィードバックを提供できるサムアップ/ダウンアイコンをオーバーレイします。 AJAX呼び出しには、広告URL(iFrame src)とユーザーID(consumer_id)が渡されます。次に、thumbs up/downアクションを記録するためにデータベースに書き込んだ後、インプレッションIDを返します。

コード例:

index.html:

_<body>
    <iframe src="https://ad.doubleclick.net/ddm/adi/N4406.154378.CRITEO/B9862737.133255611;sz=728x90;click=http://cat.fr.eu.criteo.com/delivery/ck.php?cppv=1&amp;cpp=ZNbxVXxoRmlURGJwS3JrRUZxTXVnNG83QmlTRUhSNDgzZEFXeEt6Q2VkcXpuTlFXTzBPUytNL0t3QW1NR2hiWXMyU1Jjb0NsTDZZQk8ybzRnajZnZlNodTJKNjhiSW8yaFlPTVBDRUlZQjJ5QVNUQjQrNHd5UEJicEI5OS95NUUxMWVDbGRZamZ4RjZYS1FHam5LQ1dpcENzanhtcEhlckpmOEVuSUhRTllIQnBPazlnMnQ3eWVJcjhOSzRYOXYwOXlqYVFrTnI0eDZJSTBjR1lGM2VUVVloQjd3RlJUcndIQUl3NUpRalY0YXV3Q29SRktKSkFJSktueU0vMVdydko4UzZGSldkbUR1RUR4MTU2a0loamFYZlpiZz09fA%3D%3D&amp;maxdest=;dcopt=anid;ord=f4840e2d31;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?" width="728" height="90" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no" bordercolor="#000000"></iframe>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script type="text/javascript" src="client.js"></script>
</body>
_

AJAX呼び出し:

_    // This isn't usually a var, but added for clarity. Usually uses a selector 
    // to grab the entire iframe DOM element, and then store in array.    
        var iframe = "http://ad.doubleclick.net/ddm/adi/N4406.154378.CRITEO/B9862737.133255611;sz=728x90;click=http://cat.fr.eu.criteo.com/delivery/ck.php?cppv=1&amp;cpp=ZNbxVXxoRmlURGJwS3JrRUZxTXVnNG83QmlTRUhSNDgzZEFXeEt6Q2VkcXpuTlFXTzBPUytNL0t3QW1NR2hiWXMyU1Jjb0NsTDZZQk8ybzRnajZnZlNodTJKNjhiSW8yaFlPTVBDRUlZQjJ5QVNUQjQrNHd5UEJicEI5OS95NUUxMWVDbGRZamZ4RjZYS1FHam5LQ1dpcENzanhtcEhlckpmOEVuSUhRTllIQnBPazlnMnQ3eWVJcjhOSzRYOXYwOXlqYVFrTnI0eDZJSTBjR1lGM2VUVVloQjd3RlJUcndIQUl3NUpRalY0YXV3Q29SRktKSkFJSktueU0vMVdydko4UzZGSldkbUR1RUR4MTU2a0loamFYZlpiZz09fA%3D%3D&amp;maxdest=;dcopt=anid;ord=f4840e2d31;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?";

        $.ajax({
            method: 'POST',
            url: 'http://my.api/url/',
            async: false,
            datatype: 'json',
            data: {
                ad_url: iframe, // fetch ad_url from iframe src
                wittel_consumer: "57fcea30f910092a06806344"
            },
            success: function(data, respText, xhr) {
                console.log('Data',data);
                console.log('XHR',xhr);
            },
            error: function(error) {
                console.log('URL',this.url);
                console.log('Error',error);
            }
        });
_

このコードでは、AJAXは動作しますが、 'error'メソッドの下に戻ります。URLが正しいことがわかり、errorコールバック内で、 _readyState: 4, status: 403, statusText: "Forbidden"_などを含むオブジェクト。前述のように、APIは他のブラウザで正常に完了するため、機能します。したがって、Edgeがリクエストを処理する方法と関係がある必要があります。または、サーバー構成である可能性があります正直、分からない。

完全なエラー:HTTP403: FORBIDDEN - The server understood the request, but is refusing to fulfill it. (XHR)POST - http://my.api/url/

5
Scott Thornton

この問題を抱えている他の人のために:

私は自分のコードをサーバーに配置し、そこから実行して、それがlocalhost接続であるかどうかをテストしました。

私が使用しているAPIは、これまで経験したことのないlocalhost接続を許可しないように構成する必要があります。

2日を無駄にして正気を失う素晴らしい方法です!

とにかく上記の提案をありがとう。感謝します。

5
Scott Thornton

オプションに資格情報を含めてください。

var url = 'https://dummy_url/_api/lists'
var options = {
    headers: {"Accept": "application/json; odata=verbose"},
    credentials: 'include'
}

fetch(url, options).then( 
    res => res.json().then(json => console.dir(json)) 
)

これでうまくいきます。

1
Roy Selim

これで行き詰まり、上記の答えのどれもあなたを助けない人は誰でも:

Edgeのバージョンを確認してください。17はPromiseをサポートしていません。

Edge 18とPromiseを含む2018年10月のアップデートでWindowsをアップグレードすると、フェッチ要求が機能します。

https://www.Microsoft.com/ja-jp/software-download/windows1

0
Pixelomo

私は同じ問題を抱えていました。

データベースのレコードの一部と関係があることが判明しました。ほとんどのレコードで操作はスムーズに機能しますが、403を取得する場合もあれば、500を取得する場合もあります。

私自身の経験では、それはlocalhostとは何の関係もありません。正常に動作します。一部のレコードと関係があります...キー以外のフィールドの重複を探しますが、クエリで参照されています。

0
Jay Ell III

これらの設定をリクエストに追加してみてください:

"headers": {
    "Content-Type": "application/json",
    "cache-control": "no-cache",
},
"processData": false,
0
Guildenstern70