伪静态规则写错最常见后果是后台登录跳转失败、路由无限重定向或POST数据丢失;根本原因在于规则未匹配PHP框架的真实URL解析逻辑,如ThinkPHP、Laravel等需适配宝塔的if+rewrite机制而非直接套用Nginx官方location或try_files。

伪静态规则写错,最常见后果不是 404,而是后台登录跳转失败、路由无限重定向、或 POST 数据莫名丢失——这往往不是宝塔的问题,而是规则没匹配上程序的真实 URL 解析逻辑。
PHP 程序(如 ThinkPHP、Laravel)的 rewrite 规则不能直接抄 Nginx 官方示例
宝塔用的是 Nginx,但很多 PHP 框架文档给的 location 块是为标准 Nginx 配置写的,直接粘贴进宝塔「伪静态」框会出问题:宝塔的伪静态入口本质是 if (!-e $request_filename) + rewrite,不支持嵌套 location 或 try_files。
- ThinkPHP 6 的正确写法是:
if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } - Laravel 应该用:
if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; }(注意末尾/$1,不是?s=$1) - 直接贴官方文档里的
try_files $uri $uri/ /index.php?$query_string;会报错,因为宝塔伪静态框不解析try_files
PATH_INFO 和 QUERY_STRING 混用导致路由解析错乱
有些程序(比如旧版 CodeIgniter)依赖 PATH_INFO,而宝塔默认开启的 PHP 配置可能把所有参数都塞进 QUERY_STRING,结果 $_SERVER['PATH_INFO'] 为空,路由完全失效。
- 检查 PHP 设置里是否勾选了「禁止 PATH_INFO」,必须取消勾选
- 伪静态规则中如果用了
$1,要确认后端是否真的通过PATH_INFO读取——ThinkPHP 5.1+ 默认走QUERY_STRING,但 5.0 是靠PATH_INFO - 在
phpinfo()页面搜索path_info,看值是否为/xxx而不是空,这是最直接验证方式
WordPress 的 permalink 规则在子目录部署时必须改路径前缀
宝塔建站时选了「子目录」(比如网站根目录是 /www/wwwroot/example.com/blog/),但 WordPress 后台设置固定链接后,直接套用宝塔内置的 WordPress 伪静态模板会 404——因为模板默认假设网站在根目录。
- 原模板:
rewrite ^(.*)$ /index.php?$1; - 子目录部署应改为:
rewrite ^/blog/(.*)$ /blog/index.php?$1;(注意开头和中间的/blog) - 同时 WordPress 后台「设置 → 固定链接」里,“博客地址(URL)” 必须填带
/blog的完整地址,否则生成的链接还是错的 - 如果用多站点(Multisite),伪静态规则完全不同,不能沿用单站模板
真正卡住人的地方,往往不是规则语法本身,而是程序怎么从 $request_uri 里拆出控制器和方法——这个逻辑藏在框架源码里,不翻 public/index.php 或路由引导文件,光调伪静态永远调不对。

















