HTTP403: FORBIDDEN - 服务器理解请求,但拒绝执行

Posted

技术标签:

【中文标题】HTTP403: FORBIDDEN - 服务器理解请求,但拒绝执行【英文标题】:HTTP403: FORBIDDEN - The server understood the request, but is refusing to fulfill it 【发布时间】:2017-02-23 15:37:57 【问题描述】:

在对 API 执行 AJAX 调用时,我不断收到上述 403 错误。

错误出现在 Microsoft Edge 中,但在 IE、Chrome、Firefox 或 Safari 中不会出现。

该页面不使用引导程序,因为我已经读过它可能是由于页面无法找到所需的 .LESS 文件造成的。我什至尝试包含引导程序以查看是否解决了问题 - 它没有。

我似乎无法通过谷歌搜索找到任何东西,除了一些 twitter Oauth 的东西和上面的引导答案 - 这两者都与我的应用程序无关。

正如我之前所说,AJAX 调用在任何浏览器中都可以正常工作,除了 Edge。该代码在各种浏览器中完全相同,并且响应/请求标头彼此匹配 - 因此 POST 请求发送的数据不正确(在不同浏览器默认值或其他情况下)不是一种情况。

这就是我想要实现的目标:

index.html 包含 4 个 iFrame 房屋广告。然后,我的 javascript 代码会选择 iFrame 标记并覆盖一个拇指向上/向下图标,用户可以在其中为所述广告提供反馈。 AJAX 调用传递了 Advert URL (iFrame src) 和用户 ID (consumer_id)。然后在写入数据库后返回一个展示 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=?"   margin margin 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 被操作,但在“错误”方法下返回。我可以看到 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/

【问题讨论】:

在调试此类事情时相当笨拙...但是也许尝试在您的 ajax 调用中添加标头? headers: 'Content-Type': 'application/json; charset=utf-8' 是检查标题。如果 post 和 header 相同,则服务器将没有理由以禁止的方式回答一次,而其他时间则以正确的结果回答。您的请求不能完全相同,如果它确实在其他浏览器中工作 - 而不仅仅是静默失败。 你能发布完整的 ajax 请求,包括标题吗?否则,您还可以尝试比较其他浏览器和 Edge 发送到服务器的标头是什么。 感谢大家的回复,想通了。这是因为我正在从 localhost 执行呼叫。这在过去从未对我造成过问题,但我猜这与 API 配置停止 localhost 连接有关。 【参考方案1】:

对于遇到此问题的其他人:

我将我的代码放在服务器上并从那里运行到它以测试它是否是本地主机连接 - 它是。

我使用的 API 必须配置为不允许本地主机连接,这是我以前从未经历过的。

浪费 2 天时间并失去理智的好方法!

感谢以上建议。欣赏它。

【讨论】:

如何解决,目前我在向localhost发送请求时也遇到了同样的问题。【参考方案2】:

请在选项中包含凭据。

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)) 
)

这对我有用。

【讨论】:

【参考方案3】:

尝试将这些设置添加到您的请求中:

"headers": 
    "Content-Type": "application/json",
    "cache-control": "no-cache",
,
"processData": false,

【讨论】:

【参考方案4】:

其他遇到此问题且上述答案均无济于事的人:

检查您的 Edge 版本,17 不支持 Promises。

使用包括 Edge 18 的 2018 年 10 月更新升级 Windows,并且支持 Promises,获取请求将起作用。

https://www.microsoft.com/ja-jp/software-download/windows10

【讨论】:

以上是关于HTTP403: FORBIDDEN - 服务器理解请求,但拒绝执行的主要内容,如果未能解决你的问题,请参考以下文章

如何处理SAP HANA Web-Based Development Workbench的403 Forbidden错误

打开网页显示403-forbidden啥意思啊

HTTP403: FORBIDDEN - 服务器理解请求,但拒绝执行

服务器以 403 (Forbidden) 状态响应

apache 403 forbidden怎么解决

403错误怎么解决