avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 thinkphp6 如何绑定域名到应用
文章

thinkphp6 如何绑定域名到应用

发表于 2026-03-30 更新于 2026-03- 30
作者 mdo
7~10 分钟 阅读

在ThinkPHP6中绑定域名到应用,可以通过配置文件或路由设置来实现。以下是几种常见的方法:

方法一:通过配置文件绑定

app.php

<?php
// +----------------------------------------------------------------------
// | 应用设置
// +----------------------------------------------------------------------
return [
    // 应用域名绑定(自动多应用模式有效)
    'domain_bind' => [
        'admin.example.com' => 'admin',  // 绑定admin应用
        'api.example.com'   => 'api',    // 绑定api应用
        'www.example.com'   => 'index',  // 绑定index应用
    ],
];

方法二:通过路由配置绑定

在route/app.php文件中添加域名绑定规则:

app.php

<?php
use think\facade\Route;

// 绑定admin应用到admin.example.com
Route::domain('admin.example.com', function () {
    // 默认的路由规则定义
    Route::get('/', 'index/index');
});

// 绑定api应用到api.example.com
Route::domain('api.example.com', function () {
    // API路由规则
    Route::get('user/:id', 'user/read');
});

方法三:在入口文件中绑定

在public/index.php中直接绑定域名到应用:

index.php

<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../app/');

// 绑定域名
$http = (new \think\App())->http;

// 绑定admin域名到admin应用
if ($_SERVER['HTTP_HOST'] == 'admin.example.com') {
    $response = $http->name('admin')->run();
}
// 绑定api域名到api应用
elseif ($_SERVER['HTTP_HOST'] == 'api.example.com') {
    $response = $http->name('api')->run();
}
// 默认绑定到index应用
else {
    $response = $http->name('index')->run();
}

$response->send();
$http->end($response);

方法四:使用中间件处理域名绑定

创建一个域名绑定中间件:

DomainBind.php

<?php
namespace app\middleware;

class DomainBind
{
    public function handle($request, \Closure $next)
    {
        $host = $request->host();
        
        // 根据域名绑定到不同的应用
        switch ($host) {
            case 'admin.example.com':
                $request->app = 'admin';
                break;
            case 'api.example.com':
                $request->app = 'api';
                break;
            default:
                $request->app = 'index';
        }
        
        return $next($request);
    }
}

然后在全局中间件配置中注册:

middleware.php

<?php
// 全局中间件定义文件
return [
    \app\middleware\DomainBind::class,
];

注意事项

  1. 确保在DNS服务器中已将域名正确解析到服务器IP

  2. 在Web服务器(如Nginx/Apache)中配置虚拟主机

  3. 如果使用多应用模式,确保目录结构正确

  4. 测试时可以使用本地hosts文件模拟域名解析

推荐方案

对于生产环境,推荐使用方法一(配置文件绑定)或方法二(路由配置绑定),因为这两种方式:

  • 配置集中,易于维护

  • 性能较好

  • 支持动态路由

  • 可以利用ThinkPHP的路由特性

对于开发环境或特殊需求,可以使用方法三或方法四。

选择哪种方法取决于你的具体需求和项目架构。如果只是简单的域名绑定,方法一最简单直接;如果需要更灵活的路由控制,方法二更为合适。

技术
ThinkPHP6
许可协议:  CC BY 4.0
分享

相关文章

7月 26, 2026

完美地解决 TP3 老系统数据的平滑读取

为了彻底、完美地解决 TP3 老系统数据的平滑读取,必须解决两个核心痛点: TP3 的盲猜反序列化机制(标量存原样,数组/对象存原生 serialize,同时兼容 json)。 TP3 与 TP6 的缓存前缀(Prefix)不一致。 以下是为你量身定制的终极落地解决方案,通

7月 26, 2026

thinkphp3 redis序列化和反序列化

在老系统重构迁移至 ThinkPHP 6 (TP6) 的过程中,ThinkPHP 3 (TP3) 的 Redis 序列化历史遗留问题是最核心的连环坑之一。 TP3 的 S('key', $value) 缓存方法和底层 Redis 驱动,在存储非字符串(如数组、对象)时,有一套独特的序列化行为。如果不

7月 24, 2026

Table 空间极易发生哈希冲突并溢出

既然你没有在业务中主动调用 Room,只使用了全局广播,那么这个问题就非常明确了:即使你不用房间功能,think-swoole 只要开启了 WebSocket,底层就会强行初始化并注入一个名为 Room 的驱动组件。 [1] 框架底层默认使用 table 类型来作为 Room 的存储介质。当进行全局

下一篇

Gitkraken 最新版v9、v10破解教程

上一篇

运维脚本

最近更新

  • 完美地解决 TP3 老系统数据的平滑读取
  • thinkphp3 redis序列化和反序列化
  • Table 空间极易发生哈希冲突并溢出
  • 将监控程序直接跑在云端
  • AI 驱动型 Facebook 群组关键词监控 Chrome 浏览器插件

热门标签

API CodeGeex Gitkraken Management Manticore Premiere Sublime Swoole ThinkPHP ThinkPHP5

目录

©2026 mdo. 保留部分权利。