ThinkPHP可通过Nginx/Apache泛域名配置+Route::domain('img.example.com')路由分组+Image控制器解析@参数实现二级域名图片处理。需开启url_domain_deploy、限制路径与尺寸、加Redis缓存防重复处理。

ThinkPHP 本身不直接支持二级域名的图像处理路由,但可以通过 Nginx/Apache 配置 + 路由分组 + 图像处理扩展(如 think-image 或自定义 GD/Imagick 封装)实现「独立子域名调用图片处理服务」的效果。核心在于:将 img.example.com 指向同一套 ThinkPHP 应用,并在应用内识别子域名,走专用图像处理逻辑。
一、DNS 与 Web 服务器配置(让子域名生效)
确保二级域名已解析到服务器 IP,并在 Web 服务中统一指向 ThinkPHP 的入口目录(如 public/):
- Nginx 示例:无需单独 server 块,用泛解析或通配 server_name 匹配所有子域
server {
listen 80;
server_name example.com *.example.com;
root /path/to/thinkphp/public;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- Apache 可通过
VirtualHost+ServerAlias *.example.com实现类似效果 - DNS 设置 A 记录:
img.example.com → 你的服务器IP
二、ThinkPHP 中识别并路由子域名请求
在 app/middleware.php 或全局中间件中判断 Host,标记为「图片处理请求」;再配合路由分组定向处理:
- 在
app/route/app.php中定义子域名专属路由
// 路由文件中
Route::domain('img.example.com', function () {
// 所有 img 子域下的请求都走这里
Route::get(':path', 'Image/index')
->pattern(['path' => '.*']);
});
-
:path捕获完整路径(如/uploads/avatar.jpg@w_200,h_200,q_85),便于后续解析参数 - 确保
app/config/app.php中'url_domain_deploy' => true开启域名部署支持
三、编写 Image 控制器处理动态图片请求
创建 app/controller/Image.php,解析 URL 中的原始图路径和处理指令(如缩略、裁剪、水印等):
立即学习“PHP免费学习笔记(深入)”;
- 使用
think-image扩展(composer require topthink/think-image)快速操作 - 关键逻辑:提取原图相对路径 → 定位真实文件 → 解析 @ 后参数 → 执行处理 → 输出二进制流
public function index($path = '')
{
// 解析:uploads/photo.jpg@w_300,h_200,q_90 → ['file'=>'uploads/photo.jpg', 'opts'=>['w'=>300,'h'=>200,'q'=>90]]
[$file, $opts] = $this->parseImageRequest($path);
$realPath = ROOT_PATH . 'public' . DS . $file;
if (!is_file($realPath)) {
return $this->errorImage(); // 返回 404 占位图或抛异常
}
$image = \think\Image::open($realPath);
if (isset($opts['w']) && isset($opts['h'])) {
$image->thumb($opts['w'], $opts['h'], \think\Image::THUMB_CENTER);
}
if (isset($opts['q'])) {
$image->quality($opts['q']);
}
return $image->response();
}
四、安全与性能注意事项
子域名直出图片看似方便,但需严防路径遍历、恶意参数、大图爆内存等问题:
- 禁止解析含
../的路径,只允许白名单目录(如uploads/、static/images/) - 限制最大宽高(如 ≤2000px)、质量范围(30–100)、处理超时(
set_time_limit(5)) - 建议加一层 Redis 缓存已处理图片的 URL → 文件哈希 → 缓存路径,避免重复处理
- 生产环境关闭调试模式,禁用
display_errors,防止敏感路径泄露



















