伪静态不生效主因是服务器模式切换后配置未同步:Apache需AllowOverride All+rewrite模块真实加载,Nginx应禁用if重写、改用try_files,并确保运行目录与伪静态规则匹配。

伪静态不生效,90%不是规则写错了,而是服务器模式切换后配置没同步更新——Nginx 和 Apache 的生效机制完全不同,混用旧配置必然失效。
Apache 下 .htaccess 不执行:检查 AllowOverride 和模块加载
宝塔新建站点默认是 AllowOverride None,哪怕 .htaccess 文件存在、语法正确,Apache 也会直接跳过它。必须进对应站点的虚拟主机配置文件(路径类似 /www/server/panel/vhost/apache/xxx.com.conf),在 <directory></directory> 块里确认有:
-
AllowOverride All(不能是FileInfo或AuthConfig) -
Require all granted(Apache 2.4+ 必须项,缺了会 403)
改完要「重载配置」,不是「重启」;否则 httpd -M | grep rewrite 可能仍看不到 rewrite_module (shared) —— 模块没真正加载。
Nginx 下 location / 规则被 if + rewrite 卡死:优先用 try_files
大量用户复制的 WordPress 伪静态模板还在用 if (!-f $request_filename) { rewrite ... },这在 Nginx 1.21+ 已被标记为“不推荐”,PHP 8.4 下更易触发重写循环或忽略 PATH_INFO。直接替换为:
location / {
try_files $uri $uri/ /index.php?$args;
}
关键点:
- 删掉所有
if块,try_files是原子操作,性能更好也更稳定 -
$args而非$query_string,兼容 PHP-FPM 对 QUERY_STRING 的解析逻辑 - 若站点含 wp-admin,单独加一行:
rewrite ^/wp-admin$ $scheme://$host$uri/ permanent;
切换模式后伪静态模板没自动适配:别信下拉菜单里的“已选”
宝塔面板在网站设置 → 伪静态 页面里,即使你看到下拉框显示“WordPress”,实际写入的可能是 Apache 的 RewriteRule 或 Nginx 的 location,取决于当前站点绑定的 Web 服务类型。但手动切换过 Web 服务(比如从 Apache 改为 Nginx)后,这个字段不会自动刷新。
务必执行以下动作:
- 进【伪静态】页,先点【删除】清空当前规则
- 再从下拉菜单重新选一次对应框架(如 WordPress)
- 保存后,SSH 执行
nginx -t && service nginx reload或bt reload 8,不能只点面板上的「保存」
运行目录与伪静态共同失效:404 往往是两个配置打架
伪静态规则最终要把请求转给 index.php,但如果宝塔「网站目录」里「运行目录」设成了 /,而程序实际入口在 /public,那 try_files 或 RewriteRule 找到的 index.php 就是错的路径——结果仍是 404。
检查顺序必须是:
- 先确认【网站】→【设置】→【网站目录】→【运行目录】是否指向真实入口(Laravel/ThinkPHP 填
/public,WordPress 填/) - 再验证伪静态规则是否匹配该目录结构(比如
/public/index.php需要在规则中体现路径偏移) - 最后看日志:
tail -f /www/wwwlogs/xxx.com.error.log,出现File not found就是运行目录错,出现rewrite or internal redirection cycle就是规则套娃了
最常被忽略的是:改了运行目录不点「保存」,或改了伪静态不 reload 服务——两处都得动,少一步都不行。


















