Phil Sturgeon中的HTTP选项错误';s Codeigniter Restserver和Backbone.js
当我试图将模型保存到位于另一个主机/URL上的restful web服务时,我的Phil Sturgeon中的HTTP选项错误';s Codeigniter Restserver和Backbone.js,codeigniter,rest,backbone.js,http-options-method,codeigniter-restserver,Codeigniter,Rest,Backbone.js,Http Options Method,Codeigniter Restserver,当我试图将模型保存到位于另一个主机/URL上的restful web服务时,我的backbone.js应用程序抛出HTTP OPTIONS not found错误 根据我的研究,我得出以下结论: 一个请求会不断地发送一个选项http请求头,而根本不会触发POST请求 显然,带有“对用户数据造成副作用”的请求的CORS会在实际发送预期的HTTP请求方法之前,让您的浏览器“预飞”带有选项请求头的请求,以检查批准情况 我试图通过以下方式解决这个问题: 将主干中的EmulatoreHttp设置为tru
backbone.js
应用程序抛出HTTP OPTIONS not found错误
根据我的研究,我得出以下结论:
一个请求会不断地发送一个选项http请求头,而根本不会触发POST请求
显然,带有“对用户数据造成副作用”的请求的CORS会在实际发送预期的HTTP请求方法之前,让您的浏览器“预飞”带有选项请求头的请求,以检查批准情况
我试图通过以下方式解决这个问题:
- 将主干中的EmulatoreHttp设置为true
- 我还允许在标题中使用所有CORS和CSRF选项
标题('Access-Control-Allow-Origin:')
标题(“访问控制允许标题:来源、X请求、内容类型、接受”); 标题(“访问控制允许方法:GET、POST、OPTIONS”)
主干.emulateHTTP
代码行时,应用程序崩溃
在CodeIgniter RESTServer中是否有一种响应选项请求的方法,以及是否有其他替代方法来允许禁用该请求
我找到了一个解决办法。我不确定是否应该使用它,因为它似乎有点过时。我遇到了完全相同的问题。为了解决这个问题,我在内核中有一个MY_REST_Controller.php,我的所有restapi控制器都使用它作为基类。我只是添加了一个这样的构造函数来处理选项请求
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,如果为OPTIONS,则返回请求的代码200。您还可以修改子类中的
$allowed\u http\u methods
属性以排除OPTIONS方法。早期版本的REST_控制器对选项没有任何作用,添加这一行似乎模仿了这种行为:
protected $allowed_http_methods = array('get', 'delete', 'post', 'put');
解决这一问题比排名更高的答案要干净得多+1搜索数小时后;这就是解决办法。谢谢:)在此基础上,我们可以添加“访问控制允许源代码”,如下标题('Access-Control-Allow-Origin:'。$\u SERVER['HTTP\u Origin']);因此,在这里您可以检查允许哪个域访问您的api。发送204响应可能更好:因此代码应该是:parent::\uu construct();如果($\u SERVER['REQUEST\u METHOD']==“OPTIONS”){$this->response(NULL,HTTP\u NO\u CONTENT);return;}我可以知道为什么需要拒绝所有'OPTIONS'请求方法吗?它在本地工作,否则我们需要直播并上传到服务器。我使用codeigniter并在前端反应js。我们必须把这个放在哪里。?