thinkphp项目在nginx下启用伪静态需配置try_files规则并正确传递path_info,放行静态资源、禁止敏感文件访问,最后通过nginx -t和curl验证生效。

ThinkPHP 项目在 Nginx 下启用伪静态,核心是让所有非静态资源请求都统一交由 index.php 入口文件处理,同时避免暴露真实路径和重复访问静态文件。规则本身不复杂,但需注意版本差异和常见陷阱。
基础伪静态规则(适用于 ThinkPHP 5.0+ 和 6.x)
这是最常用、兼容性最好的写法,放在对应 server 块中:
- 匹配所有非真实存在的文件或目录,重写到
index.php - 显式放行 CSS、JS、图片等静态资源,提升性能
- 避免因重写导致 favicon.ico 404 或重复加载入口
示例配置片段:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
⚠️ 注意:if 在 location 中虽可用,但 Nginx 官方不推荐嵌套使用。更稳妥的写法是用 try_files:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
ThinkPHP 6.x 的 PATH_INFO 模式适配
TP6 默认使用 pathinfo(如 /index/index/hello),需确保 Nginx 正确传递 PATH_INFO。关键点:
- 不能只靠重写,还要设置
fastcgi_param解析路径 - 需配合 PHP-FPM 的
fix_pathinfo=1(默认开启,建议确认) - 推荐完整 fastcgi 配置段(含 PATH_INFO 提取)
在 location ~ \.php(?:$|/) 内添加:
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
排除静态资源与安全防护
避免把 JS、CSS、图片也转发给 PHP 处理,既浪费资源又可能暴露敏感路径:
- 为常见静态后缀单独加 location,用
expires缓存 - 禁止访问 .env、.log、.git 等敏感文件
- 限制上传目录执行 PHP(如
upload/)
示例:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
<p>location ~* (^|/).(env|log|git|htaccess|ini)$ {
deny all;
}</p><p>location ^~ /runtime/ {
deny all;
}</p>
验证与调试技巧
规则写完别急着 reload,先检查是否生效:
- 执行
nginx -t确保语法正确 - 用
curl -I http://your.site/test/route查看返回状态码(应为 200 而非 404) - 在控制器中打印
input()或Request::path(),确认路由参数被正常解析 - 查看 Nginx error.log,常见报错如 “No input file specified” 多因 SCRIPT_FILENAME 路径错误
如果页面空白或 500,优先检查 fastcgi_param SCRIPT_FILENAME 是否指向真实 index.php 路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











