12

当我的客户端应用程序和 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");

仍然是同样的错误。

4

9 回答 9

23

尝试添加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 的流程。

于 2014-09-06T19:27:36.900 回答
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'] = [];
于 2016-12-18T08:22:04.920 回答
6

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

public function __construct($config = 'rest')
{
    header('Access-Control-Allow-Origin: *');
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
    parent::__construct();
}
于 2017-10-03T10:54:42.867 回答
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);
于 2016-05-26T22:56:41.260 回答
0

如果你可以使用 jQuery Ajax,那么在你的脚本中使用这一行。

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

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

于 2014-09-06T19:33:28.523 回答
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'
];
于 2020-05-23T15:58:38.197 回答
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);
        }
于 2020-12-13T21:32:23.267 回答
0

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

所以制作一个控制器来命名你想要的任何东西。

做一个方法

在方法中使用 curl:

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

使用这样的路由:/controller/method在我们的例子中是 index

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

于 2021-02-01T11:55:27.557 回答
0

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

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");
于 2021-04-12T00:16:02.313 回答