在 codeigniter 中启用 cors(restserver by @chriskacerguis)

问题描述 投票:0回答:11
当我的客户端应用程序和 api 位于本地主机时,agularJs 控制器中的 http.get 请求工作正常。 当 api 移至服务器时,出现问题。

使用 angularJs 的客户端

$http.get('http://example.com/api/spots/2/0').success(function(data){ console.log(data); });
日志给出:
跨源请求被阻止:同源策略不允许读取 

http://example.com/api/spots/2/0 处的远程资源。这可以通过将资源移动到同一域或启用 CORS 来解决。

我已将这两行添加到我的控制器构造中

header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET");
还是同样的错误。

php angularjs codeigniter codeigniter-restserver
11个回答
25
投票
尝试将

OPTIONS

 添加到允许的方法中。

header("Access-Control-Allow-Methods: GET, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding");

一旦设置了标头,当请求是方法“OPTIONS”时立即返回。

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

另请参阅

此答案

Angular 发送一个

W3C CORS 规范兼容的预检请求,它将在实际尝试之前检查是否有正确的允许方法。

就我个人而言,我发现

Mozilla 开发者网络 CORS 页面更容易阅读该问题,有助于理解 CORS 的流程。


21
投票
如果其他人也遇到这个问题,在 Codeigniter REST 控制器的rest.php 文件中启用 CORS 对我来说很有用。这也清楚地记录在此处的评论中

https://github.com/chriskacerguis/codeigniter-restserver/blob/master/application/config/rest.php

//Change this to TRUE $config['check_cors'] = TRUE; //No change here $config['allowed_cors_headers'] = [ 'Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Access-Control-Request-Method', 'Authorization', ]; //No change here $config['allowed_cors_methods'] = [ 'GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE' ]; //Set to TRUE to enable Cross-Origin Resource Sharing (CORS) from any source domain $config['allow_any_cors_domain'] = TRUE; //Used if $config['check_cors'] is set to TRUE and $config['allow_any_cors_domain'] is set to FALSE. //Set all the allowable domains within the array //e.g. $config['allowed_origins'] =['http://www.example.com','https://spa.example.com'] $config['allowed_cors_origins'] = [];
    

6
投票
我在我的控制器类中添加了以下构造函数

public function __construct($config = 'rest') { header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); parent::__construct(); }
    

1
投票
客户端 => AngularJs(在 localhost:9000 中使用 Grunt 运行) 服务器端 => php (codeIgniter 解决方案) (在 localhost:80 中运行)

唯一对我有用的就是将此行添加到我的 php 项目中的 webservices 控制器中:

/* here you do whatever you do to build the $data */ //but just before returning the method data add this header('Content-type: application/json'); header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET"); header("Access-Control-Allow-Methods: GET, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding"); echo json_encode($data, JSON_NUMERIC_CHECK);
    

1
投票
在控制器的父构造函数中添加以下代码

header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET, OPTIONS, POST, GET, PUT"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding");
    

1
投票
将此添加到您的

config.php 以便发送 access-control-allow-origin

 HTTP 标头以接受来自任何地方的连接。

$method = $_SERVER["REQUEST_METHOD"]; if ($method == 'OPTIONS') { header("access-control-allow-origin: *"); die(""); }
    

0
投票
如果您可以使用 jQuery Ajax,请在脚本中使用此行。

jQuery.support.cors = true; // force cross-site scripting (as of jQuery 1.5)

当我尝试使用 jQuery Ajax 从侧边栏桌面小工具将一些字符串发布到 xampp php 文件时,它解决了我的问题。


0
投票
要通过@amal-ajith 添加答案,应将标头添加到rest.php 文件中。例如,我需要为 Ionic 4 应用程序 api 调用/请求添加授权令牌,我所需要做的就是添加rest.php 文件的标头字段,我的 cors 错误就得到了处理。

Access to XMLHttpRequest at 'http://localhost/ci/index.php/api/validate_token' from origin 'http://localhost:8100' has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response.

//No change here $config['allowed_cors_headers'] = [ 'Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Access-Control-Request-Method', 'Authorization' ];
    

0
投票
这里有很多可能的解决方案,但没有一个对我有用。 我做了一些挖掘并发现了一些东西。我不会解释,但我希望它对你有用。

Add the following block of code in your controller file .


if (isset($_SERVER['HTTP_ORIGIN'])) { // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one // you want to allow, and if so: header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); // cache for 1 day } // Access-Control headers are received during OPTIONS requests if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) // may also be using PUT, PATCH, HEAD etc header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); exit(0); }
    

0
投票
对我来说,我在其中一个路由控制器中使用了curl。我正在使用 codeignitor 4。

所以制作一个控制器,命名任何你想要的名字。

制定一个方法

在方法中使用curl:

public function index() { //code using curl or file get contents depending upon your api}


使用这样的路线:

/controller/method

在我们的案例索引中

参考:

https://codeigniter4.github.io/userguide/incoming/controllers.html


0
投票
如果你有像routes.php那样的路线:

$route['profile']['get'] = 'AdminController/index';

更改为:

$route['profile'] = 'AdminController/index';

© www.soinside.com 2019 - 2024. All rights reserved.