tp5.0 ajax 填写了 Access-Control-Allow-Origin仍然显示跨域

黄晓晓小智
  • 21

网上基本所有的方法都试过了,还是无法解决
第一种方法,在入口文件:public/index.php

header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Methods:GET,POST,PUT,OPTIONS,DELETE");
header("Access-Control-Allow-Headers:Origin, X-Requested-With, Content-Type, Accept");

无效~

第二种方法:挂钩子
在application/下新建一个CORS.php


namespace app\sendApi;

use think\Response;

class CORS
{
    public function run(&$dispatch)
    {
        header("Access-Control-Allow-Origin:*");
        $host_name = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : "*";
        $headers = [
            "Access-Control-Allow-Origin" => $host_name,
            "Access-Control-Allow-Credentials" => 'true',
            "Access-Control-Allow-Headers" => "x-token,x-uid,x-token-check,x-requested-with,content-type,Host"
        ];
        if ($dispatch instanceof Response) {
            $dispatch->header($headers);
        } else if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
            $dispatch['type'] = 'response';
            $response = new Response('', 200, $headers);
            $dispatch['response'] = $response;
        }
    }
}

同时在tag.php中的app_init,app_begin,app_end中都添加了路径,确定路径是正确的,但是仍然显示跨域

错误提示:
微信图片_20200428110115.png

image

回复
阅读 2.4k
1 个回答

特意建了个 5.0.24 的项目,测试正常可以。

方案 1 (入口添加)

  • /public/index.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

// [ 应用入口文件 ]

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
header('Access-Control-Allow-Origin: https://qq.com');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

响应结果

图片.png

方案 2(Hook 添加)

  • application/tags.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用行为扩展定义文件
return [
    // 应用初始化
    'app_init' => [],
    // 应用开始
    'app_begin' => [],
    // 模块初始化
    'module_init' => [],
    // 操作开始执行
    'action_begin' => [],
    // 视图内容过滤
    'view_filter' => [],
    // 日志写入
    'log_write' => [],
    // 应用结束
    'app_end' => [
        '\app\hooks\CorsHook',
    ],
];
  • application/hooks/CorsHook.php
<?php


namespace app\hooks;


use think\Response;

class CorsHook
{
    public function run(&$param)
    {
        if (!$param instanceof \think\Response) {
            return;
        }
        /** @var Response $param */
        $param->header([
            'Access-Control-Allow-Origin' => 'http://baidu.com',
        ]);
    }
}

响应结果

图片.png

补充

Hook 类的 run 方法参数的 引用符号 (&) 是可选的,因为对象默认是引用传递的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏