当我尝试将模型保存到位于另一个主机/ URL上的restful Web服务时,我的backbone.js
应用程序抛出了HTTP OPTIONS not found错误。
根据我的研究,我从post收集了:
请求会不断发送OPTIONS http请求标头,并且根本不会触发POST请求。
显然,CORS会对“导致用户数据产生副作用”的请求将使您的浏览器“预检”带有OPTIONS请求标头的请求,以便在实际发送您的预期HTTP请求方法之前检查批准。
我试图绕过这个:
Backbone.emulateHTTP = true;
我还允许在标题中允许所有CORS和CSRF选项。
标题('Access-Control-Allow-Origin:*');
header(“Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Accept”);
header(“Access-Control-Allow-Methods:GET,POST,OPTIONS”);
当引入Backbone.emulateHTTP
代码行时,应用程序崩溃了。
有没有办法在CodeIgniter RESTServer中响应OPTIONS请求,是否还有其他选择允许从谈话地点禁用此请求?
我发现this on Github是一个解决方案。我不确定是否应该使用它,因为它看起来有点过时了。
答案 0 :(得分:40)
我遇到了完全相同的问题。为了解决这个问题,我在核心中有一个MY_REST_Controller.php,我所有的REST API控制器都将它用作基类。我只是添加了一个这样的构造函数来处理OPTIONS请求。
function __construct() {
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
$method = $_SERVER['REQUEST_METHOD'];
if($method == "OPTIONS") {
die();
}
parent::__construct();
}
这只是检查请求类型是否为OPTIONS,如果是,就会消失,返回请求的代码200.
答案 1 :(得分:7)
您还可以修改子类中的$allowed_http_methods
属性以排除选项方法。以前版本的REST_controller没有对 OPTIONS 做任何事情,添加此行似乎模仿了这种行为:
protected $allowed_http_methods = array('get', 'delete', 'post', 'put');