thinkphp二级域名伪静态核心在服务器层转发:apache需统一documentroot并用标准.htaccess规则,nginx需为各子域配独立server块及try_files;框架内须开启url_domain_deploy并用route::domain()定义路由。

ThinkPHP 配置二级域名伪静态,核心不在框架本身,而在于 Web 服务器是否把子域名请求正确转发到 index.php 入口。只要这一步走通,框架内用 Route::domain() 分组定义路由即可生效。
Apache 下共用项目目录的配置要点
多个子域名(如 www.example.com、admin.example.com)指向同一套 ThinkPHP 代码时,关键在虚拟主机配置统一、重写规则通用:
-
DocumentRoot 必须一致:所有子域名的
<virtualhost></virtualhost>块中,DocumentRoot都要指向项目根目录(含public/),例如/var/www/html/myapp -
.htaccess 放在 public 目录下,内容保持标准规则,无需按子域名单独修改:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] -
确保 Apache 开启重写模块且允许覆盖:检查
httpd.conf中LoadModule rewrite_module已启用,并将对应目录的AllowOverride None改为All
Nginx 下需独立 server 块配置
Nginx 不共享配置,每个子域名必须单独定义 server 块,且 root 或 alias 指向正确入口:
-
root 推荐指向 public 目录:比如项目路径是
/var/www/html/myapp,则root /var/www/html/myapp/public; -
location / 必须包含 try_files,确保非静态资源兜底到入口:
location / { try_files $uri $uri/ /index.php?s=$uri&$args; } -
PHP 处理块也要配合 try_files,防止直接 404:
location ~ \.php$ { try_files $uri /index.php?s=$uri&$args; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
ThinkPHP 框架内需开启域名部署支持
服务器转发到位后,框架才开始识别子域名并分发路由:
- 在
config/app.php中设置:'url_domain_deploy' => true - 在
route/app.php中按域名分组注册路由,例如:Route::domain('admin.example.com', function () { Route::get('login', 'admin/Login/index'); Route::group('admin', function () { Route::get('dashboard', 'admin/Index/dashboard'); }); }); - 注意:子域名路由不会自动继承主站路由,必须显式定义或手动引入公共规则
常见失效原因与验证方法
如果配置后仍跳转 404 或返回原始 URL,优先排查底层转发是否真正到达 index.php:
- 临时在
public/index.php开头加一行file_put_contents('/tmp/debug.log', $_SERVER['HTTP_HOST'].': '.$_SERVER['REQUEST_URI']."\n", FILE_APPEND);,访问子域名看日志是否记录 - 检查浏览器地址栏——若出现
index.php,说明服务器未重写;若直接 404,说明重写未命中或入口路径错误 - 确认 DNS 和 hosts 已正确解析子域名,避免测试阶段因域名未生效误判配置问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











