宝塔面板粘贴thinkphp伪静态规则仍404,主因是运行目录未设为/public、规则末尾用break而非last、php禁用了scandir/putenv/ini_set;必须将if+rewrite规则置于location ~ .php$之前、选下拉菜单中/public、重载nginx且确保fastcgi_param path_info $request_uri;生效。

宝塔面板里直接粘贴 ThinkPHP 伪静态规则就能用,但多数人配完还是 404,问题几乎都出在三处:运行目录没设成 /public、规则里用了 break 而不是 last、PHP 禁用了 scandir 或 putenv。
为什么粘了规则还是 404?
宝塔「伪静态」文本框里粘的那几行,只是写进 Nginx 配置文件,不重载服务就等于没改。更关键的是,TP6 的路由解析依赖原始请求路径传进 $_GET['s'],而这个过程被卡在三个环节:
-
if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }必须放在location ~ \.php$块之前,否则 PHP 文件匹配优先级更高,rewrite 根本不触发 - 用
break会让重写后不再重新匹配 location,index.php?s=xxx被当成静态文件返回源码或 404;last才能确保请求真正进到 PHP 处理流程 - 宝塔默认站点根目录指向项目顶层(如
/www/wwwroot/myapp),但 TP6 只允许public/被 Web 访问——必须进「网站目录」→「运行目录」下拉菜单里选/public,不能手输、不能留空
多应用模式下伪静态怎么写?
单应用规则 rewrite ^(.*)$ /index.php?s= last; 对 /admin/login 这类地址完全无效,Nginx 会直接返回 404,根本不会转发给 PHP。多应用要靠正则把第一段路径提取出来,拼进 s 参数:
- 正确写法(两段式):
if(!-e $request_filename) { rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /index.php?s=$1/$2 last; rewrite ^/(.*)$ /index.php?s=$1 last; } - 第一行捕获应用名(如
admin、api),第二行兜底处理首页、静态资源等无前缀请求 - 应用名含下划线或中划线时,正则字符集必须补全,比如
[a-z0-9A-Z_\-],否则/user_v2/login会漏匹配 - 光改规则不够,还要确认
config/app.php中'app_multi' => true已开启,且app/multi.php明确列出了合法应用名
PHP 配置里哪些函数不能禁用?
TP6 启动时要扫描 app/、config/ 目录加载类和配置,同时路由解析强依赖 PATH_INFO,以下三项一旦被拦,轻则 404,重则白屏:
-
scandir:必须从 PHP「禁用函数」列表中删掉(进宝塔 → 软件商店 → PHP 设置 → 配置修改 → 搜索disable_functions) -
putenv和ini_set:TP6 启动时需动态设置环境变量和PATH_INFO,禁用会导致URL pathinfo not supported错误 -
fastcgi_param PATH_INFO $request_uri;:进「配置文件」选项卡,在location ~ \.php($|/)块内,删掉原有的fastcgi_split_path_info和fastcgi_param PATH_INFO $fastcgi_path_info;,补上这行
最常被忽略的一点:规则保存后,必须手动点「重载 Nginx」,而不是只点「保存」;重载失败时看错误日志,常见原因是 if 块位置错、last 写成 break、或 /public 没从下拉菜单里选中。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











