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

Posted

技术标签:

【中文标题】Phil Sturgeon 的 Codeigniter Restserver 和 Backbone.js 中的 HTTP OPTIONS 错误【英文标题】:HTTP OPTIONS error in Phil Sturgeon's Codeigniter Restserver and Backbone.js 【发布时间】:2013-03-14 04:25:13 【问题描述】:

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

根据我的研究,我从post 收集到:

一个请求会不断发送一个 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 请求,还有其他替代方法可以允许从通话位置禁用此请求吗?


我发现this on Github 是一种解决方案。我不确定是否应该使用它,因为它似乎有点过时了。

【问题讨论】:

【参考方案1】:

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

【讨论】:

搜索几个小时后;这就是解决方案。谢谢:) 在它之上我们可以像这样添加“Access-Control-Allow-Origin”, header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);这样您就可以在此处检查允许哪些域访问您的 api。 发送 204 响应可能更好:因此代码为: parent::__construct(); if($_SERVER['REQUEST_METHOD'] === "OPTIONS") $this->response(NULL,HTTP_NO_CONTENT);返回; 请问您为什么需要拒绝所有 'OPTIONS' 请求方法? 它在本地工作,否则我们需要生活并上传到服务器。我在前端使用 codeigniter 和 react js。我们必须把它放在哪里。?【参考方案2】:

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

protected $allowed_http_methods = array('get', 'delete', 'post', 'put');

【讨论】:

解决POST request with AngularJS fails with preflight OPTION status code = 404 with CodeIgniter ResetServer 这比排名越高的答案要清晰得多。 +1

以上是关于Phil Sturgeon 的 Codeigniter Restserver 和 Backbone.js 中的 HTTP OPTIONS 错误的主要内容,如果未能解决你的问题,请参考以下文章

text Phil Delong 2017-12-16 1-of-96.txt

使用 NuGet 管理项目库-Phil Haack

jQuery Mobile入门经典 ([美] Phil Dutson) 中文pdf扫描版

函数式编程大神Phil Wadler帮助Go团队设计泛型 | Gopher Daily (2020.06.09) ʕ◔ϖ◔ʔ

LMS 中单个学生的 Next.js/Mongodb 分配状态

致命错误:未捕获的 ArgumentCountError