ThinkPHP6二级域名伪静态需Nginx独立server块、多应用专用rewrite规则、/public运行目录、PHP放开putenv/ini_set/scandir并透传PATH_INFO、框架启用url_domain_deploy及Route::domain()分组路由,缺一即导致404或参数污染。

ThinkPHP6 配置二级域名伪静态,本质是“域名级路由隔离 + 服务器重写 + 框架多应用适配”三者联动。不是只改一条 rewrite 规则就能生效,漏掉任一环节都会导致请求错路、404 或跨应用参数污染。
一、Nginx 必须为每个二级域名建独立 server 块
不能共用一套规则或 root 路径。例如:
www.example.com、admin.example.com、api.example.com —— 即使指向同一台服务器、同一 IP,也必须各自定义完整 server 块。
- 每个 server 块中 root 必须明确指向对应项目的 /public 目录,例如:
root /www/wwwroot/admin/public; -
server_name 必须精确匹配,不建议用泛域名(如
*.example.com),避免 admin 请求被 www 的规则捕获 - HTTPS 站点需单独写一个
server { listen 443 ssl; }块,里面的 location 和 rewrite 规则要与 HTTP 块完全一致
二、伪静态规则要支持多应用前缀识别
TP6 多应用靠 URL 第一段识别应用名(如 /admin/login 中的 admin)。宝塔默认的单应用规则会失效,必须用两段式 rewrite:
- 在每个 server 块的
location / { }内手动插入(位置必须在location ~ \.php$之前):
if (!-e $request_filename) {<br>
rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /index.php?s=$1/$2 last;<br>
rewrite ^/(.*)$ /index.php?s=$1 last;<br>
}
- 第一行捕获带应用前缀的路径(如
/admin/user→s=admin/user) - 第二行兜底处理根路径、静态资源(如
/static/css/app.css不匹配第一行,但真实存在,if判断后不重写) - last 不可替换:只有 last 才会让重写后重新进入 location 匹配流程,确保 PHP-FPM 正确加载
三、运行目录和 PHP 环境必须同步对齐
光有规则还不够,这三项设错,全站直接 404:
-
运行目录必须选
/public:进宝塔 → 网站 → 设置 → 网站目录 → 运行目录 → 下拉选择/public(不是手动填,不是留空,也不是/) -
PHP 禁用函数中必须放开
putenv、ini_set、scandir:TP6 启动时依赖它们动态设置 PATH_INFO -
PHP 处理块必须透传 PATH_INFO:检查
location ~ \.php$ { }内是否有这两行:fastcgi_split_path_info ^(.+\.php)(/.+)$;<br> fastcgi_param PATH_INFO $fastcgi_path_info;
四、框架内开启域名路由分组
服务器分流只是第一步,框架层不隔离,请求仍可能被其他应用的路由捕获:
- 在
config/app.php中启用域名部署:'url_domain_deploy' => true, - 在
route/route.php中使用Route::domain()分组定义路由,例如:
Route::domain('admin.example.com', function () {<br>
Route::get('login', 'admin/Login/index');<br>
});<br>
Route::domain('api.example.com', function () {<br>
Route::post('user', 'api/User/add');<br>
});
- 这样即使两个应用都注册了
/login,也不会冲突
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











