选项 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-Origin
和OPTIONS
对吧?但是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)