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

mccptt67  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(78)

当我尝试将模型保存到位于另一个主机/URL上的REST Web服务时,我的backbone.js应用程序抛出了HTTP OPTIONS not found错误。
根据我的研究,我从这个post中得出:
一个请求会不断地发送OPTIONS http请求头,而根本不会触发POST请求。
显然,带有“对用户数据造成副作用”的请求的CORS将使您的浏览器在实际发送您预期的HTTP请求方法之前,对带有OPTIONS请求头的请求进行“预检”,以检查是否批准。
我试图通过以下方式解决这个问题:

  • 正在将 Backbone 网中的emulateHTTP设置为true。

Backbone 网.仿真HTTP = true;

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

header(“访问控制允许来源:*');
标题(“访问控制允许标题:来源、X请求方、内容类型、接受”);标题(“访问控制允许方法:获取、发布、选项”);
引入Backbone.emulateHTTP代码行时,应用程序崩溃。
是否有一种方法可以在CodeIgniter RESTServer中响应OPTIONS请求,是否有其他替代方法可以允许或禁用来自谈话场所的此请求?
我发现this on Github是一个解决方案。我不确定我是否应该使用它,因为它似乎有点过时。

qyswt5oh

qyswt5oh1#

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

cunj1qz1

cunj1qz12#

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

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

h5qlskok3#

我这样解决了:

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();
}

请注意,在访问控制允许标头中添加x_requested_with。

相关问题