18

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

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

一个请求会不断地发送一个 OPTIONS http 请求头,而根本不会触发 POST 请求。

显然,带有“对用户数据造成副作用”的请求的 CORS 将使您的浏览器在实际发送您预期的 HTTP 请求方法之前“预检”带有 OPTIONS 请求标头的请求以检查批准。

我试图通过以下方式解决这个问题:

  • 将 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 上发现了这个作为一种解决方案。我不确定我是否应该使用它,因为它似乎有点过时了。

4

2 回答 2

49

我遇到了完全相同的问题。为了解决这个问题,我在核心中有一个 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。

于 2013-10-11T04:28:06.923 回答
7

您还可以修改$allowed_http_methods子类中的属性以排除选项方法。以前版本的 REST_controller 没有对OPTIONS做任何事情,添加这一行似乎模仿了这种行为:

protected $allowed_http_methods = array('get', 'delete', 'post', 'put');
于 2013-12-11T05:25:57.523 回答