thinkphp伪静态在局域网测试环境失效,根本原因是服务器未将原始路径传递给index.php:apache需启用mod_rewrite、allowoverride all并正确配置.htaccess;nginx需在location /中配置try_files且在location ~ .php$中添加fastcgi_param path_info $fastcgi_path_info;入口必须为/public/index.php,并通过var_dump($_server['path_info'])验证路径是否送达。

局域网测试环境里 ThinkPHP 伪静态跑不通,基本不是框架问题,而是服务器没把原始路径交到 index.php 手里——Apache 没传 PATH_INFO,Nginx 漏了 fastcgi_param PATH_INFO,或者你根本没让请求进到 public/ 目录。
Apache 局域网调试:.htaccess 生效但路由 404?先查这三件事
Mac 或 Windows 自带 Apache、XAMPP、phpStudy 这类本地环境,默认不启用重写模块,也不允许 .htaccess 起作用。光放规则文件没用。
- 确认
mod_rewrite已加载:Linux/macOS 执行sudo apachectl -M | grep rewrite;Windows 查httpd.conf是否取消了#LoadModule rewrite_module modules/mod_rewrite.so的注释 -
AllowOverride必须设为All(不是None或FileInfo):在<directory></directory>块里找这一行,改完必须重启 Apache -
.htaccess必须放在public/目录下(和index.php同级),内容用最简版,别套<ifmodule></ifmodule>:RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]如果项目部署在子路径(如http://192.168.1.100/myapp/),必须加RewriteBase /myapp/
Nginx 局域网调试:为什么 try_files 不生效?
局域网常用 phpEnv、Docker 或宝塔内网版,Nginx 配置稍有偏差就会 fallback 失败,导致 /user/login 直接返回 Nginx 404 页面,而不是 TP 的路由错误页。
- 规则必须写在
location /块里,且必须在location ~ \.php$之前,否则 PHP 处理块优先匹配,try_files不触发 - TP6/8 默认依赖
PATH_INFO,所以除了try_files,还必须在location ~ \.php$块里显式加:fastcgi_param PATH_INFO $fastcgi_path_info;
漏掉这行,$_SERVER['PATH_INFO']就是空的 - 入口路径要对:TP6/8 入口强制是
/public/index.php,不是/index.php。规则里的 fallback 必须写成/public/index.php?s=$uri&$args(注意&是 HTML 实体,配置文件里不能写成&)
框架层验证:PATH_INFO 到底有没有被 PHP 收到?
别猜,直接看。在 public/index.php 顶部第一行插入:
var_dump($_SERVER['PATH_INFO'] ?? 'MISSING', $_SERVER['REQUEST_URI'] ?? 'MISSING');die;然后访问
http://192.168.1.100/index/hello。输出 MISSING 就说明服务器根本没传路径信息;输出类似 /index/hello 才算过关。
- TP5 默认用
PATH_INFO,TP6/8 可选PATH_INFO或REQUEST_URI,但无论哪种,都要求服务器把原始 URL 路径段完整交给 PHP - 检查
config/app.php中:'url_route_on' => true(TP5)或'route_enable' => true(TP6/8)必须开启,否则即使路径到了,框架也直接忽略 - TP6/8 若启用了多应用模式,还要确认
APP_DEBUG开启,否则路由错误可能静默失败
局域网环境最大的坑是「看起来能访问」——比如 /index.php/user/login 能走通,但去掉 index.php 就 404。这不是路由没写对,是服务器根本没把 /user/login 这段路径塞进 PATH_INFO 或 s 参数里。盯住 $_SERVER 数组,比看文档快十倍。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











