在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的路由特性

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

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