必须严格对齐原环境的PHP版本、扩展、Nginx规则、权限及.env配置,否则90%问题源于隐性配置差异:如PHP 8.2移除mysql_connect、fileinfo缺失致Laravel报错、运行目录未设/public致敏感路径暴露、伪静态未适配框架路由机制、.env未隔离导致安全泄露、MySQL 8.0认证插件不兼容、OPcache残留使新配置失效。

直接迁移 PHP 项目到新服务器时,只复制代码和数据库远远不够——宝塔面板的环境配置(PHP 版本、扩展、Nginx 规则、权限、.env 文件)必须严格对齐原环境,否则 90% 的问题出在「看似一样,实则不同」的隐性配置上。
确认原服务器 PHP 版本与扩展是否完全一致
很多迁移失败是因为新版 PHP 默认禁用某些函数或扩展行为变更。比如 PHP 8.2 中 mysql_connect() 已彻底移除,而老项目若没用 mysqli 或 pdo_mysql 就会白屏;又如 fileinfo 缺失会导致 Laravel 的 Storage::put() 报错。
- 登录原服务器宝塔 → 软件商店 → 已安装 → 找到对应 PHP 版本 → 点击「设置」→ 「安装扩展」,逐项核对勾选项:必含
fileinfo、pdo_mysql、mbstring、openssl、curl,框架专用扩展如redis(Laravel/TP6)、gmp(加密类项目)也不能漏 - 在「禁用函数」页检查是否手动删了
exec、shell_exec等——若原项目依赖这些(如调用 FFmpeg 或 Composer 命令),新环境必须同步放开 - 对比
php.ini关键参数:upload_max_filesize、post_max_size、max_execution_time,尤其上传大文件或导出报表类项目,数值不一致会直接卡死
网站根目录与运行目录必须按框架规范重设
宝塔新建站点默认把整个项目目录设为根目录,但 Laravel/ThinkPHP/Symfony 等现代框架要求 Web 入口仅暴露 public 子目录,否则 .env、config/、app/ 等敏感路径可能被直接访问。
- 进入新站点设置 → 「基本」→ 「运行目录」:Laravel 必填
/public,ThinkPHP 6 填/public或留空(取决于部署方式),WordPress 可留空 - 同时检查「网站目录」是否指向正确路径,例如
/www/wwwroot/myapp,而非/www/wwwroot/myapp/public—— 后者会导致 Nginx 找不到index.php - 若用宝塔「一键部署」创建站点,它可能自动把
public当作根目录,此时需手动将项目整体移回上级目录,并修正运行目录,否则后续伪静态规则全部失效
伪静态规则不能靠“选模板”,得看框架真实路由机制
宝塔伪静态下拉菜单里的 thinkphp 或 laravel 规则只是通用模板,实际生效依赖 Nginx 是否启用 try_files 和 PATH_INFO 支持。常见错误是规则粘贴了但路由 404,本质是 fastcgi_param SCRIPT_FILENAME 指向错误或未开启 pathinfo。
立即学习“PHP免费学习笔记(深入)”;
- Laravel 推荐用 Nginx 原生
try_files规则(比 PATH_INFO 更稳定):location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>}并确保location ~ \.php$块中包含include fastcgi.conf; - ThinkPHP 6 若用
url模式(非pathinfo),伪静态必须匹配其rewrite规则,且 PHP 设置中要开启enable_pathinfo = 1(在 PHP 设置 → 配置修改里搜索并取消注释) - 切勿在「伪静态」栏直接粘贴 Apache 的
.htaccess内容——Nginx 不识别RewriteRule,会静默忽略导致路由全挂
数据库与 .env 文件的权限和内容必须隔离处理
.env 是迁移中最容易出安全问题的环节:直接从旧服务器复制过来,里面可能含测试数据库密码、Redis 地址、阿里云 AK/SK,一旦被 Nginx 错误暴露,等于交出服务器控制权。
- 上传后立即检查
.env文件权限:应为644(不可执行),且所在目录不能被 Web 服务直接列出(宝塔默认已禁用目录浏览,但仍建议在「网站设置 → 目录保护」中添加.env到禁止访问列表) -
.env中的DB_HOST必须改为127.0.0.1(不是localhost),否则 MySQL 8.0+ 默认走 socket 连接,在宝塔环境下常因 socket 路径不对而连不上 - 数据库导入后,立刻进 phpMyAdmin 或命令行执行:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';—— MySQL 8.0 默认的caching_sha2_password插件,PHP 7.4 以下版本原生不支持
最易被忽略的是 OPcache 缓存残留:即使重启 PHP,旧项目的 opcode 可能仍驻留在共享内存中,导致新 .env 配置不生效、路由跳转错乱。迁移后务必在 PHP 设置中点击「清除 OPcache」,而不是只点「重启」。



















