ThinkPHP 6.0 子目录伪静态需Nginx用alias+try_files精准定位public目录,并在config/app.php中设base_url='/youdomain'、public_path='/youdomain/public',且public/index.php顶部手动赋值$_SERVER['SCRIPT_NAME']。

ThinkPHP 6.0 在子目录部署(比如域名后带 /youdomain/)时,要实现伪静态,关键不是改 rewrite ^/youdomain/(.*)$ 这种写法本身,而是要让 Web 服务器(Nginx 或 Apache)正确将请求转发到子目录下的 public/index.php,同时保证 ThinkPHP 能识别当前运行在子目录中。
确认子目录部署结构
假设你的项目放在网站根目录的 youdomain/ 文件夹下,实际可访问路径是:https://example.com/youdomain/
而入口文件位于:youdomain/public/index.php
Nginx 正确 rewrite 规则(推荐)
在 Nginx 的 server 块中,针对子目录 /youdomain/ 配置 location,**不要用全局重写匹配 ^/youdomain/(.*)$**,而是直接定位该路径,并重写到 index.php:
✅ 正确写法(Nginx):
location /youdomain/ {
alias /path/to/your/project/youdomain/public/;
try_files $uri $uri/ /youdomain/public/index.php?$query_string;
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include fastcgi_params;
fastcgi_param SCRIPT_NAME /youdomain/public/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass php-fpm;
}
}
说明:
-
alias指向public/目录(注意结尾有/),不是root; -
try_files把所有非静态资源请求交给index.php处理; -
SCRIPT_NAME显式设为/youdomain/public/index.php,这是 TP6 识别子目录的关键; - 务必确保
public/是唯一 Web 可访问目录,禁止暴露 application 等核心目录。
ThinkPHP 6 配合配置(必须)
仅靠 rewrite 不够,TP6 需要明确知道它运行在子目录中,否则 URL 生成、资源路径会出错。在 config/app.php 中设置:
'app_host' => '', 'app_debug' => true, 'app_trace' => false, // ? 关键:设置应用根 URL(含子目录路径) 'root_domain' => 'https://example.com', 'url_domain_root' => '/youdomain', // ? 或更直接的方式(推荐): 'public_path' => '/youdomain/public', 'base_url' => '/youdomain',
同时,在 public/index.php 顶部(在 require __DIR__.'/../vendor/autoload.php'; 之前)手动设置运行环境:
$_SERVER['SCRIPT_NAME'] = '/youdomain/public/index.php'; $_SERVER['SCRIPT_FILENAME'] = __DIR__ . '/index.php';
Apache .htaccess 替代方案(如用 Apache)
把以下内容放入 youdomain/public/.htaccess:
RewriteEngine On
RewriteBase /youdomain/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
并确保主配置允许 .htaccess 覆盖(AllowOverride All),且 PHP 开启 mod_rewrite。
不复杂但容易忽略:rewrite 是路由入口,TP6 的 base_url 和 SCRIPT_NAME 才决定内部 URL 构建是否正确。两者必须配合,缺一不可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











