【问题标题】:php api rest does not accept cors requests even using header ('Access-Control-Allow-Origin: *');即使使用标头 ('Access-Control-Allow-Origin: *'),php api rest 也不接受 cors 请求;
【发布时间】:2019-01-01 09:46:26
【问题描述】:

我正在创建一个 Angular 应用程序 6 和 php 中的 api rest。 当我的 Angular 应用程序尝试执行以下 url 请求时:http://localhost/bdevApi/api/index/categoryexame?page=1 加载如下错误:

未能加载对预检请求的响应未通过访问 控制检查:不存在“Access-Control-Allow-Origin”标头 请求的资源。因此,原点 'http://localhost:4200' 是 不允许访问。

角度在4200端口,我的api在80

我可视化了一些教程并将以下标题添加到我的 api 中

api/index.php

  <?php
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');

    include("config/config.php");
    include("import/Interpreter.php");
    include("import/SendJson.php");
    include("database/Connection.php");
    include("import/AuthToken.php");

    $db = Connection::getInstance();

    if( $db->getStateConnection() )
    {
        $arrayHeader = getallheaders();
        $token = isset($arrayHeader["token"]) ? $arrayHeader["token"] : ""; 

        // Recupera dados via Json
        $strJson = file_get_contents('php://input'); //echo $strJson;
        $jsonObject = json_decode($strJson); //var_dump($strJson);


        $Interpreter = new Interpreter(
            "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]", 
            $_SERVER['REQUEST_METHOD'],
            $jsonObject
        );

        if(AuthToken::validateToken($token))
            $Interpreter->initializes(true);
        else
        {
            if($token == "") 
                $Interpreter->initializes(false);       
            else
            {
                $S = new SendJson();
                $S->Send("200", "1", "Token não autenticado", null);
            }   
        }
        $db->closeConnection();
    }

    ?>

如何让我的应用程序接受这些标头而不显示此错误?

[编辑] []1

新错误

加载失败 http://localhost/bdevApi/api/index/categoriaexame?page=1:没有 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 访问。

【问题讨论】:

  • 您是否在 chrome 调试器中检查了 OPTIONS 请求的响应正文和标头?如果是选项,您的服务器应该立即返回 200。也许它正在遍历其余代码并返回其他内容
  • 这个我不是很懂,我刚上Network Headers 那里是Request Method: OPTIONS, Status Code: 200 OK
  • 这是一个好的开始。通常还有一个响应正文选项卡。 OPTIONS 请求中没有任何内容?
  • 在我的响应标头中显示状态为 200,但我找不到任何与选项有关的内容
  • 是的,如果你能做到的话。显示请求和响应标头

标签: php angular cors


【解决方案1】:

发生这种情况是因为跨域政策。您可以通过本文档了解有关 CORS 的详细知识:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Server-Side_Access_Control

你可以试试下面的代码:

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    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']))
        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);
}

【讨论】:

  • 我能够将数据加载到网络中,但尚未用于应用程序
猜你喜欢
  • 2014-11-20
  • 2018-07-03
  • 2019-06-19
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2018-09-19
  • 2019-02-07
相关资源
最近更新 更多