ThinkPHP 5.0 在 Nginx 下实现伪静态需三步:一、开启路由并设 pathinfo_depr 为 '/';二、Nginx root 指向 public 目录,用 try_files 规则转发请求至 /index.php?s=$uri;三、PHP 块中正确配置 fastcgi_split_path_info 和 PATH_INFO 参数,确保路由解析正常。

ThinkPHP 5.0 在 Nginx 下实现伪静态,核心目标是让访问 https://example.com/user/login 这类 URL 时不出现 index.php,且能正确路由到对应控制器方法。这需要服务器配置与框架设置协同生效,单靠改规则容易 404 或白屏。
确保 ThinkPHP 5.0 路由已启用
进入项目根目录的 application/config.php(或 conf/config.php),确认以下配置项为 true:
-
'url_route_on' => true(开启路由) -
'url_common_param' => true(启用普通模式,即s=xxx参数解析) -
'pathinfo_depr' => '/'(PATH_INFO 分隔符设为斜杠,与 Nginx 规则匹配)
若使用.env文件,也要确保APP_DEBUG=false或未禁用路由。
Nginx 主配置必须指向 public 目录
ThinkPHP 5.0 推荐将入口文件 index.php 放在 public/ 子目录下。Nginx 的 root 指令必须明确指向该目录,例如:
root /var/www/myapp/public;
不是项目根目录(如 /var/www/myapp),否则静态资源(CSS/JS)会 404,$uri 匹配也会失效。
用 try_files 替代 if 判断(推荐写法)
在 server 块中添加如下 location / 配置:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
这个规则含义是:
- 先尝试匹配真实存在的静态文件(如
/static/js/app.js) - 再尝试匹配目录(如
/admin/) - 都不命中时,交由
/index.php?s=原始路径&查询参数处理
注意:s=$uri 是 TP5.0 默认识别的路由参数名,不能写成 s=/user/login(开头多斜杠会导致解析异常),所以 $uri 已含前导 /,直接拼接即可。
PHP 处理块要透传 PATH_INFO(关键细节)
在 location ~ \.php$ 块中,必须包含以下两行:
fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_split_path_info ^(.+\.php)(/.+)$;
否则 TP5.0 启动时检测不到合法 PATH_INFO,会报错 “URL pathinfo not supported”。
同时确保 fastcgi_param SCRIPT_FILENAME 使用 $document_root(非 $realpath_root,TP5.0 不依赖 realpath):
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
静态资源建议单独拦截(提升性能)
把下面这段放在 location / 之前(Nginx 优先匹配靠前规则):
location ~* \.(?:css|js|png|jpe?g|gif|webp|woff2?|ttf|eot|mp4|pdf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
这样图片、脚本等直接由 Nginx 返回,不走 PHP,既快又省资源。
验证是否成功:
- 访问
https://your-domain.com/index.php应返回正常页面(说明入口可执行) - 访问
https://your-domain.com/index/index(假设路由存在)应正常响应,地址栏无index.php,也不跳转 - 查看 Nginx 错误日志(
/var/log/nginx/error.log),若仍有FastCGI sent in stderr: "Primary script unknown",大概率是root路径没对准public/目录。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











