avatar

麦兜的小站

MDO.INK

  • 首页
  • 随笔
  • 知识库
  • 归档
  • 动态
  • 标签
  • 关于
Home ThinkPHP5.1设置允许跨域的几种办法
文章

ThinkPHP5.1设置允许跨域的几种办法

Posted 2025-03-3 Updated 2025-03- 3
By power 已删除用户
8~10 min read

在制作项目中,难免会遇到有跨域问题,需要增加指定响应头来满足跨域的需求。但ThinkPHP5.1版本的手册中,对跨域怎么设置提供的方法比较局限,所以这里经过研究,总结出了几种办法,推荐使用第三种。

一、路由

这方法是手册当中介绍的,这里简单复制下,深入了解可以查看手册。

如果某个路由或者分组需要支持跨域请求,可以使用

Route::get('new/:id', 'News/read')->ext('html')->allowCrossDomain();
Route::group('index', function() {
    Route::get('new/:id', 'News/read');
})->prefix('index/')->allowCrossDomain();

这方法,仅适合定义了路由的情况下使用,如果是默认路由,这方法不适用。

二、header()函数

可以在入口文件index.php、公共函数文件common.php等文件里使用header()函数定义跨域响应头。代码如下:

header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');
header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');
header('Access-Control-Allow-Origin: *');

全局允许跨域的话,在入口文件或全局公共函数文件里增加跨域代码
单模块允许跨域的话,在模块公共函数文件里增加跨域代码
单控制器允许跨域的话,在控制器文件里增加跨域代码(命名空间与类声明之间区域)
单方法允许跨域的话,在方法代码开头增加跨域代码。或者使用路由设置跨域。

这个方法可能会存在响应头被覆盖的问题(框架输出响应内容时,设置了相同的响应头,后设置覆盖前设置)

三、中间件

可以使用中间件,更改响应输出内容。这种方法适合全局或部分模块使用。
创建application/http/middleware/AllowCrossDomain.php文件,文件内容如下:

注意修改允许跨域的域名

<?php
namespace apphttpmiddleware;

/**
 * 跨域中间件
 * @package apphttpmiddleware
 */
class AllowCrossDomain
{
    /**
     * @param thinkRequest $request
     * @param Closure $next
     * @return mixed|thinkResponse
     */
    public function handle($request, Closure $next)
    {
        // 允许跨域的域名
        $allowOriginDomain = ['www.kancloud.cn', 'll00.cn'];
        // HTTP请求头中的Origin
        $origin = $request->header('origin', '');
        // 附加响应头
        $header = [];

        if (!empty($origin)) {
            $domain = explode('://', $origin)[1] ?? '';
            if (in_array($domain, $allowOriginDomain)) {
                $header['Access-Control-Allow-Credentials'] = 'true';
                $header['Access-Control-Allow-Methods']     = 'GET, POST, PATCH, PUT, DELETE';
                $header['Access-Control-Allow-Headers']     = 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With';
                $header['Access-Control-Allow-Origin']      = '*';
            }
        }

        return $next($request)->header($header);
    }
}

在application/middleware.php或application/index/middleware.php文件加入

apphttpmiddlewareAllowCrossDomain::class

示例:

<?php
return [
    // 允许跨域
    apphttpmiddlewareAllowCrossDomain::class,
    // 登录认证
    //appwxampmiddlewareCheckLogin::class,
    // 权限验证
    //appwxampmiddlewareCheckPermission::class,
];

四、输出响应对象实例设置

可以在json()、jsonp()和xml()等函数里设置跨域响应头,如:

return json(
    [
        'code' => 0,
        'msg'  => '操作成功',
    ],
    200,
    [
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Allow-Methods'     => 'GET, POST, PATCH, PUT, DELETE',
        'Access-Control-Allow-Headers'     => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With',
        'Access-Control-Allow-Origin'      => '*',
    ]
);
后端
License:  CC BY 4.0
Share

Further Reading

Jun 19, 2025

2024 年这 5 个 Node.js 后端框架最受欢迎

本文将介绍2024年的前5个Node.js后端框架,它们的特点和常见用例。 Express.js:经过测试的冠军 Express.js是Node.js最著名的后端框架之一。它是一个开源的Web应用程...

Jun 11, 2025

PHP Crop Image While Uploading with Cropper JS

In this post you can find how to use Cropper.js library for Crop image before uploading of image to the server using PHP script. In this tutorial you

Mar 6, 2025

Building a Simple Blog with Flight PHP

ThisguidewalksyouthroughcreatingabasicblogusingtheFlightPHPframework.You'llsetupaproject,defineroute...

OLDER

linux复制指定目录下的全部文件到另一个目录中

NEWER

【docker】私有IM | Matrix的部署与使用

Recently Updated

  • 如何实现接口幂等性
  • 10个npm工具包
  • How to set up PHP7.4 on MacOS.
  • Automa:一键自动化,网页数据采集与工作流程优化专家Automa:解锁自动化
  • Mac 下用 brew 搭建 LNMP

Trending Tags

thinkphp clippings

Contents

©2025 麦兜的小站. Some rights reserved.

Using the Halo theme Chirpy