选项 405(方法不允许)

14

所以,我正在尝试在我的网站上实现文件上传进度条。如果我只是上传资源

$.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可能不允许*作为接受的值,这取决于服务器/客户端的实现-https://dev59.com/02oy5IYBdhLWcg3wL7H1#8719346 - Femi
2
通常情况下,405状态码是由Web服务器本身发出的。因此,您可能需要检查您的Web服务器配置。 - Markus Müller
@MjrKusanagi 在这种情况下无关紧要--Access-Control-Allow-Origin: * 是一个可接受的值。 - Byte Lab
只是确认一下 - 在那个php脚本的顶部确实没有其他任何东西,对吗?它就是 <?php 和那两个函数调用吗? - Byte Lab
是的,文件的第一行是 `<?phpheader('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS');` - user3194367
显示剩余11条评论
2个回答

6

首先,我不认为这与您的CORS配置有任何关系,因为它会输出不同的错误。在考虑Azure/IIS环境下可能引起您收到错误的原因时,我找到了以下可能性:

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

最后,我刚找到了这篇答案,其中提供了一些不同的解决方案,您可以在服务器配置中设置CORS标头,而不是在PHP文件中进行设置。


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

0

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

或者你也可以通过 .htaccess 来实现,这将在你的任何 PHP 脚本之前进行处理。这是基于你使用 Apache 作为你的 Web 服务器的假设。

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"

头文件是代码的第一行: - user3194367
你尝试过使用 .htaccess 方法吗? - Jonathan
服务器没有运行Apache。 - user3194367
这个答案应该可以解决问题,基本上就是我在stackoverflow上发布的关于Azure的内容。https://dev59.com/GXfZa4cB1Zd3GeqPOzQI - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接