能跑通ThinkPHP 6/8(含子目录部署),关键三处已对齐:root指向public目录、主location用try_files安全转发、PHP块中SCRIPT_FILENAME使用$realpath_root拼接。

直接用这个配置,能跑通 ThinkPHP 6/8(含子目录部署),关键三处已对齐:root 指向 public 目录、主 location 用 try_files 安全转发、PHP 块中 SCRIPT_FILENAME 使用 $realpath_root 拼接。
标准根目录部署(推荐)
适用于域名直接访问项目,如 https://example.com:
server {
listen 80;
server_name example.com;
root /var/www/myapp/public; # ✅ 必须是 public 目录
index index.php;
<pre class="brush:php;toolbar:false;">location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000; # 或 unix:/var/run/php/php8.2-fpm.sock
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
子目录部署(如 /myapp/)
当访问地址是 https://example.com/myapp/ 时,需单独声明 location 前缀,并修正 fallback 路径:
- 在 server 块内新增一个 location /myapp/ 块
- root 仍保持指向项目 public 的上级目录(如 /var/www/myapp),不写成 /var/www/myapp/public)
- fallback 路径必须带子目录前缀:/myapp/index.php?$query_string
location /myapp/ {
alias /var/www/myapp/public/;
index index.php;
<pre class="brush:php;toolbar:false;">try_files $uri $uri/ /myapp/index.php?$query_string;
}
location ~ .php$ {
注意:此处需配合 alias 使用,SCRIPT_FILENAME 应为 $request_filename
fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params;
}
必须同步检查的框架配置
Nginx 配置只是前端转发,ThinkPHP 内部也要匹配:
-
config/app.php 中确保:
'url_route_on' => true - 清空或设为空字符串:
'url_html_suffix' => '' - 确认入口文件是
public/index.php,且该文件可被直接访问(例如通过 curl http://localhost/index.php 测试) - 若用 PATH_INFO 模式(如 TP5.1),则 Nginx 中需保留
s=参数写法,但 TP6/8 默认走 QUERY_STRING 模式,?$query_string更稳妥
常见错误与修复提示
遇到 404、白屏、Class 'think\App' not found 等问题,优先核对:
- root 路径是否误写成项目根目录(如
/var/www/myapp)?必须是/var/www/myapp/public - PHP 块中是否用了
$document_root替代$realpath_root?TP8 强制依赖后者解析 autoload - 是否还在用
if (!-e $request_filename)?Nginx 1.24+ 下该写法易导致 PATH_INFO 为空,应禁用 - fastcgi_params 文件是否被覆盖或缺失?确保它包含基础参数如 SCRIPT_NAME、REQUEST_URI 等
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











