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

19
当我尝试把模型保存至位于另一个主机/URL上的RESTful Web服务时,我的backbone.js应用程序会抛出一个HTTP OPTIONS未找到错误。根据我的研究,我从这篇文章中得知:post:请求将不断发送 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上找到这个项目作为一种解决方案,但它似乎有点过时,我不确定是否应该使用它。
3个回答

51

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


2
搜索了几个小时,终于找到了解决方案。谢谢 :) - Farhan Ahmad
顶部我们可以添加 "Access-Control-Allow-Origin",如下所示,header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);这样,您可以检查允许哪个域名访问您的API。 - Prasad Shinde
可能更好地发送204响应:所以代码将是:parent::__construct();如果($_SERVER['REQUEST_METHOD'] === "OPTIONS") { $this->response(NULL,HTTP_NO_CONTENT); return;} - pgee70
请问您为什么需要拒绝所有的“OPTIONS”请求方法? - solomonculaste
它在本地工作,否则我们需要将其上传到服务器。我在前端使用CodeIgniter和React JS。我们应该把它放在哪里? - Prashanth Harish

7
您可以在子类中修改$allowed_http_methods属性,以排除选项方法。之前的REST_controller版本没有处理OPTIONS,添加这行代码似乎可以模拟该行为:
protected $allowed_http_methods = array('get', 'delete', 'post', 'put');

这个答案比排名更高的答案干净多了。+1 - Brad Bird

0

我是这样解决的:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, x_requested_with");

if ( "OPTIONS" === $_SERVER['REQUEST_METHOD'] ) {
    die();
}

请注意在Access-Control-Allow-Headers中添加x_requested_with。

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