切换服务器模式后ThinkPHP伪静态必须重配:Apache依赖.htaccess和mod_rewrite,需AllowOverride All;Nginx不解析.htaccess,须用try_files或rewrite显式拼s=参数,并设运行目录为/public、放开putenv等函数限制,改完必须重载而非重启服务。

要改。切换服务器模式后,ThinkPHP伪静态规则必须重新适配,不能沿用旧配置。
Apache 和 Nginx 的伪静态机制完全不同
Apache 依赖 .htaccess 文件和 mod_rewrite 模块,通过 AllowOverride All 启用,规则中可直接使用 [QSA,PT,L] 等标志;Nginx 不解析 .htaccess,也不支持这些 Apache 特有语法,必须用原生 rewrite 或 try_files,且需显式拼接 s= 参数或正确透传 PATH_INFO。
Apache 切换到 Nginx 后必须调整的三项核心内容
- 规则语法重写:
.htaccess中的RewriteRule ^(.*)$ index.php/$1 [L]在 Nginx 里会 404,应改为rewrite ^(.*)$ /index.php?s=$1 last;或更推荐的try_files $uri $uri/ /index.php?s=$uri&$args; - 运行目录重设:TP6 必须把宝塔站点的「运行目录」设为
/public,否则所有请求找不到入口文件 - PHP 函数限制放开:
scandir、putenv、ini_set不能被禁用,否则 TP6 启动失败或报URL pathinfo not supported
Nginx 切换回 Apache 后同样不能照搬规则
Nginx 风格的 if (!-e $request_filename) 或 location / 块在 Apache 配置中无效;应改用标准 .htaccess 写法:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]同时确认虚拟主机配置中 <directory></directory> 块含 AllowOverride All 和 Require all granted。
改完必须重载服务,不是重启
Nginx 改配置后执行 nginx -t && nginx -s reload;Apache 执行 httpd -t && systemctl reload httpd。只点宝塔界面「重启」可能不生效,尤其当语法有隐性错误时,界面常不提示。
规则是否生效,最简验证方式是访问一个带参数的路由,比如 /user/list?page=2,看 $_GET['page'] 是否存在、页面是否返回 200 而非 Nginx 层 404。
立即学习“PHP免费学习笔记(深入)”;



















