选项 405(不允许的方法)

Posted

技术标签:

【中文标题】选项 405(不允许的方法)【英文标题】:OPTIONS 405 (Method Not Allowed) 【发布时间】:2015-08-15 00:47:37 【问题描述】:

所以我试图在我的网站上获取文件上传进度条。如果我只是上传资源

$.ajax(
    url: $rootScope.URL,  //Server script to process data
    type: 'POST',
    beforeSend: beforeSendHandler,
    success: completeHandler,
    error: errorHandler,
    data: formData,
    cache: false,
    contentType: false,
    processData: false
);

它工作得很好,但是如果我添加事件来收听进度:

$.ajax(
    url: $rootScope.URL,  //Server script to process data
    type: 'POST',
    xhr: function()   // Custom XMLHttpRequest
        var myXhr = $.ajaxSettings.xhr();
        if(myXhr.upload) // Check if upload property exists
            myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // For handling the progress of the upload
        
        return myXhr;
    ,
    beforeSend: beforeSendHandler,
    success: completeHandler,
    error: errorHandler,
    data: formData,
    cache: false,
    contentType: false,
    processData: false
);

我明白了:

OPTIONS myserver.com/controller/filtercontroller.php? 405 (Method Not Allowed)
  jQuery.ajaxTransport.send 
  jQuery.extend.ajax    
  (anonymous function)  
  jQuery.event.dispatch 
  jQuery.event.add.elemData.handle  
XMLHttpRequest cannot load myserver.com/controller/filtercontroller.php?. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access. The response had HTTP status code 405.

显然我的服务器没有Access-Control-Allow-OriginOPTIONS 对吧?但是filtercontroller.php 的前两行是:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');

我尝试了几种不同的解决方案,但没有一个对我有用。

【问题讨论】:

Access-Control-Allow-Headers 可能不允许 * 作为接受值,具体取决于服务器/客户端实现 - ***.com/a/8719346/2155068 405 通常由 Web 服务器本身发出。所以你可能会检查你的网络服务器的配置。 @MjrKusanagi 在这种情况下无关紧要 -- Access-Control-Allow-Origin: * 是一个可接受的值。 只是为了确认——该 php 脚本的顶部实际上没有其他内容,对吗?它实际上是 是的,文件的第一行是<?php header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); 【参考方案1】:

所以,首先我认为这与您的 CORS 配置没有任何关系,因为它会输出不同的错误。查看可能导致您在 Azure/IIS 上下文中收到错误的原因,我发现了以下可能性:

您的web.config 文件中可能有一个明确的<remove name="OPTIONSVerbHandler" />。 (在某些情况下这是默认设置)。 WebDAV 模块是interfering,您应该添加<remove name="WebDAVModule"/>

最后我刚刚发现this answer 可能会提供一些不同的解决方案,您无需在 PHP 文件中设置 CORS 标头,而是在服务器配置中设置它们。

【讨论】:

非常感谢。更改删除名称解决了 405 错误,但没有解决 Access-Control-blah-blah 错误,这是通过按照您提供的链接并添加自定义标题来解决的。享受你的赏金。【参考方案2】:

header() 必须在任何输出发送到浏览器之前放置,一旦输出发送到浏览器,header() 实际上会抛出一个 PHP 警告,如果你没有看到,则不会显示或跟踪.

或者,您也可以通过 .htaccess 执行此操作,该文件将在您的任何 PHP 脚本之前处理。这是假设您使用 apache 作为您的网络服务器。

Header set Access-Control-Allow-Origin "*"
# below line shouldn't be needed as by default all of those are allowed,
# if you were doing PUT, TRACE, DELETE, etc then you would need it
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"

【讨论】:

标题是第一行代码: 你试过 .htaccess 方法了吗? 服务器没有运行 apache。 这个答案应该可以解决问题,它基本上是我发布的,但对于天蓝色。 ***.com/questions/18981339/…

以上是关于选项 405(不允许的方法)的主要内容,如果未能解决你的问题,请参考以下文章

来自 .aspx 页面的带有授权标头的 Ajax 发布请求给出错误“选项 405(不允许的方法)”

405 方法不允许使用 $http 服务 AngularJS

这是啥意思? “加载资源失败:服务器响应状态为 405(不允许方法)”

HTTP 405 错误 – 方法不被允许 (Method not allowed)

discord.errors.HTTPException:405 方法不允许(错误代码:0):405:方法不允许

Jersey 中不允许的 405 方法正在返回 Tomcat 的 405 页面