Phil Sturgeon的Codeigniter Restserver和Backbone.js中的HTTP OPTIONS错误

Joe*_*ean 15 rest codeigniter backbone.js http-options-method codeigniter-restserver

backbone.js当我尝试将模型保存到位于另一个主机/ URL上的restful Web服务时,我的应用程序抛出了HTTP OPTIONS not found错误.

根据我的研究,我从这篇文章中收集到:

请求将不断发送OPTIONS http请求标头,并且根本不会触发POST请求.

显然CORS的请求将"对用户数据产生副作用"将使您的浏览器"预检"带有OPTIONS请求标头的请求以检查批准,然后再实际发送您的预期HTTP请求方法.

我试图绕过这个:

  • 将Backbone中的emulateHTTP设置为true.

Backbone.emulateHTTP = true;

  • 我还允许在标题中允许所有CORS和CSRF选项.

    header('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请求,是否还有其他选择允许从谈话地点禁用此请求?


在Github上找到了这个解决方案.我不确定我是否应该使用它,因为它看起来有点过时了.

小智 43

我遇到了完全相同的问题.为了解决这个问题,我在核心中有一个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();
}
Run Code Online (Sandbox Code Playgroud)

这只是检查请求类型是否为OPTIONS,如果是,那么就会消失,返回请求的代码200.

  • 经过几个小时的搜索;这就是解决方案。谢谢 :) (2认同)

小智 7

您还可以修改$allowed_http_methods子类中的属性以排除options方法.以前版本的REST_controller对OPTIONS没有任何作用,添加此行似乎模仿了这种行为:

protected $allowed_http_methods = array('get', 'delete', 'post', 'put');
Run Code Online (Sandbox Code Playgroud)