使用CodeIgniter ResetServer,使用AngularJS的POST请求失败,预检OPTION状态代码= 404

时间:2014-05-30 12:17:04

标签: angularjs codeigniter http-post cors codeigniter-restserver

我的前端应用程序在端口grunt上的9100实时服务器上运行,而我的PHP服务器在端口80上。主机是相同的,只是端口不同。

当我向POST发送带有http://dev.site.dev/api/gistJSON数据的404请求时,我在预检OPTIONS请求中收到了错误CORS

我已经在apache配置中添加了Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Headers "X-Requested-With, accept, content-type" Header set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" 标头:

index_option()

``` 并重新启动服务器,但仍然遇到问题。

我应该在gist控制器中添加{{1}}方法吗?或问题出在其他地方?

3 个答案:

答案 0 :(得分:8)

正如我在answer on the CodeIgniter bug tracker for this "issue" #313中所描述的,有几种解决方案。

适用范围

我找到了HTTP OPTIONS error in Phil Sturgeon's Codeigniter Restserver and Backbone.js的解决方案,即从otpions中的值列表中移除$allowed_http_methods

// protected $allowed_http_methods = array('get', 'delete', 'post', 'put', 'options', 'patch', 'head');
   protected $allowed_http_methods = array('get', 'delete', 'post', 'put', 'patch', 'head');

资源专注

另一个解决方案是实施index_options()

由于拼写错误(它的 OPTIONS是复数),它第一次对我不起作用。使用此解决方案不再需要使用applications/libraries/REST_Controller.php

进行调整
public function index_options() {
    return $this->response(NULL, 200);
}

现在预检OPTION请求始终为true,因此POST请求已发送且一切正常:)

答案 1 :(得分:1)

是的,您必须添加index_options()方法。

我遇到了同样的问题,只有当我使用与POST方法相同的参数添加OPTIONS方法时,它才有效。

答案 2 :(得分:0)

就我而言,这是一个路由问题。

我所做的是覆盖404路由。之后,请求通过路由,其余服务器完成所有其他操作。

这是我在routes.php中的内容:

 <!DOCTYPE html>
    <html lang="en">
      <head>
            <title>Bootstrap Example</title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <link rel="stylesheet" type="text/css" href="./css/custom.css">        
    
        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
        <!--[if lt IE 9]>
          <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
          <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
      </head>
      <body>
    
        <div class="container">
            <div class="d-flex flex-row my-flex-container">
                <div class="p-2 my-flex-item">1</div>
                <div class="p-2 my-flex-item">2</div>
                <div class="p-2 my-flex-item">3</div>
            </div>
        </div>
            
        <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
        <!-- Include all compiled plugins (below), or include individual files as needed -->
        <script src="js/bootstrap.min.js"></script>
      </body>
    </html>