应直接使用宝塔内置框架模板而非手写伪静态规则,因其预编译适配入口逻辑、自动处理$arg/$1等关键参数、兼容nginx/apache,并避免path_info丢失等问题;选错模板或未保存配置将导致404、丢参等故障。

直接用宝塔内置模板,别手写规则——90% 的“伪静态不生效”问题,根源就是绕过了模板库,自己粘贴网上来路不明的 rewrite 块。
为什么手动填规则反而更慢
不是因为操作步骤多,而是因为每条手写规则都要反复验证:路径层级对不对、last 和 break 选没选错、$args 漏没漏、子目录前缀加没加。一次改错,就得 nginx -t + service nginx reload + 清浏览器缓存 + 测试 URL,来回折腾十几分钟。
- 宝塔模板是按程序入口行为预编译的,比如
WordPress模板自带try_files $uri $uri/ /index.php?$args,?$args这部分手写时经常被忽略,导致分页、搜索 404 -
Typecho模板用的是if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1 last; },其中$1直接拼到/index.php后,和 ThinkPHP 的/index.php?s=$1完全不是一回事,混用必挂 - 模板自动适配当前服务器类型(Nginx/Apache),你手写 Nginx 规则却部署在 Apache 环境下,连语法都报错
在哪找、怎么选、选完立刻生效
很多人点进「网站 → 伪静态」菜单就以为对了,其实那只是模板库预览页,**不保存、不写入、不生效**。真正起作用的操作路径是:
- 进「网站」列表 → 找目标站点 → 点「设置」→ 切到「伪静态」选项卡(不是左侧菜单里的独立「伪静态」)
- 下拉菜单里选框架名,如
WordPress、ThinkPHP6、Laravel,**不要选「自定义」或留空** - 点「保存」——此时宝塔已把规则写进站点配置文件,并自动执行
nginx reload(Apache 用户会提示需手动重启)
注意:如果站点是子目录部署(如 https://a.com/blog/),模板生成的规则默认是根路径逻辑,这时得额外进「配置文件」页签,把 location / 改成 location /blog/,否则所有重写都会错位。
模板选错比不选还危险
选错模板不会报错,但会导致请求转发到错误入口,典型现象是:首页能打开,点文章就 404,或者所有链接都跳回首页。这是因为不同框架解析 $_SERVER['REQUEST_URI'] 或 $_SERVER['PATH_INFO'] 的方式完全不同。
-
ThinkPHP模板输出带s=参数的 rewrite,Laravel 根本不识别这个参数,结果全走 fallback 路由 -
Laravel模板用try_files $uri $uri/ /index.php,少了?$args,表单提交、带查询参数的请求就会丢参 -
WordPress模板依赖$args,而Typecho模板依赖$1拼接,两者不可互换
如果你不确定用哪个,先查程序文档里写的「服务器要求」或「伪静态配置示例」,再回来对应模板名——别猜,也别凑合。
PHP 8.4+ 用户必须检查 pathinfo 开关
从 PHP 8.4 开始,PATH_INFO 默认不传递给脚本,而 ThinkPHP、Laravel 等框架在 PATHINFO 模式下严重依赖它。即使模板选对、规则写对,这里关着也会让路由解析失败。
- 进宝塔「软件商店」→ 找到当前 PHP 版本 →「设置」→「禁用函数」,确认没禁用
apache_getenv(有些模板靠它兜底) - 再进「配置修改」,打开
/www/server/nginx/conf/enable-php-84.conf,检查是否存在fastcgi_param PATH_INFO $fastcgi_path_info;这一行;没有就手动加上,位置在fastcgi_param SCRIPT_FILENAME下方 - 改完保存,仍要执行
nginx -t && service nginx reload
这一步容易被跳过,因为错误表现和伪静态失效一模一样:页面空白、无限重定向、后台打不开——但根源不在 rewrite,而在 PHP 接收不到原始路径信息。










