ThinkPHP伪静态关键在于root指向public目录、try_files安全转发、SCRIPT_FILENAME路径正确。需确保root为/public路径、主location用try_files $uri $uri/ /index.php?$query_string、PHP块中fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name。

ThinkPHP项目在Nginx下实现伪静态,关键不是堆砌规则,而是三处必须对齐:Nginx的root指向public/目录、主路由用try_files安全转发、PHP处理块中SCRIPT_FILENAME路径拼接正确。以下是一个可直接复制使用的完整、稳妥的 Nginx 配置示例(适配 ThinkPHP 6/8,Linux 环境):
✅ 完整可用的 server 块配置(推荐)
请将下方内容替换或写入你的站点配置文件(如 /etc/nginx/conf.d/your-site.conf 或宝塔对应 vhost 文件),注意修改路径和域名:
server {
listen 80;
server_name example.com; # 替换为你的域名
root /var/www/myapp/public; # ✅ 必须指向 public 目录,不可是项目根目录
index index.php;
<pre class="brush:php;toolbar:false;"># 主请求路由:优先找静态资源,否则交由 index.php 处理
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 处理块:明确指定入口文件路径,并透传 PATH_INFO(兼容 TP 默认模式)
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 ~ \.(gif|jpg|jpeg|png|bmp|ico|css|js|woff2?|ttf|eot|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 禁止访问敏感文件
location ~ (\.htaccess|\.env|\.git|composer\.json|artisan|\.log) {
deny all;
}}
⚠️ 配置生效前必须确认的 4 件事
-
root 路径是否指向
public/?错误示例:/var/www/myapp→ 白屏无报错;正确示例:/var/www/myapp/public -
入口文件是否存在?确保
/var/www/myapp/public/index.php可读且有执行权限 -
PHP-FPM 是否运行正常?执行
systemctl status php8.2-fpm(版本按实际调整) -
配置语法是否通过校验?运行
nginx -t,成功后再nginx -s reload
? 子目录部署(如 https://example.com/myapp/)
若项目不在域名根路径,而是在子目录,只需两处调整:
- 把
root改为站点根目录(不含子目录),例如:root /var/www/example.com; - 在
location /内改为:try_files $uri $uri/ /myapp/index.php?$query_string; - 同时确保
/myapp/下存在public/index.php,且框架配置中APP_URL或url_domain正确
? 框架层配合要点(不能只靠 Nginx)
Nginx 只负责转发,ThinkPHP 自身也需启用路由:
- 检查
config/app.php中:'url_route_on' => true -
'url_html_suffix' => ''(空字符串,支持/user/list这类无后缀 URL) -
'pathinfo_depr' => '/'(与 Nginx 传递的分隔符一致) - 开发环境建议开启调试:
'app_debug' => true,便于快速定位 404 或白屏原因
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











