搬家与换域名

搬家分三种情况:换了域名、域名不变、只换数据库账号密码。先对号入座,再照着做完,站点就能起来。

约 12 分钟 上线 代码块右上角可一键复制
本页目录(12 分钟读完)

先看清你是哪一种,别全篇照做。

出错 → 看 排错手册。

先看你哪一种#

你是哪种典型场景要改什么看哪节
A. 换了域名zz.zx15.com → cc.zx15.com数据库连接 + 域名配置「情况 A」
B. 域名不变换服务器、换机房、换 IP只改数据库连接「情况 B」
C. 只换数据库账号密码改了 MySQL 密码、换了独立账号只改数据库连接那三行「情况 C」

三种情况都要先做下面两步:备份、搬文件。


三种情况都要做:备份#

  1. 进旧服务器站点目录
  2. 复制下面两行
  3. 依次执行
Shell
mysqldump -u 用户 -p 库名 --single-transaction --quick > db.sql
tar czf site.tar.gz --exclude=runtime/cache --exclude=runtime/log --exclude=runtime/compile .

看不到 secret.key? → 先执行 ls -l data/secret.key,没有就别往下走。


三种情况都要做:搬文件#

带什么在哪丢了会怎样
secret.keydata/加密数据全解不开
database.config.phpdata/连不上库(可重建)
上传的附件runtime/upload/图片全裂
数据库上面导出的 db.sql内容全没
你自己的主题view/页面退回默认样式

不用带:runtime/cache/、runtime/log/、runtime/compile/(会自动重建)。

在新服务器还原:

Shell
cd /www/wwwroot/example.com
tar xzf site.tar.gz -C .
mysql -u 用户 -p 新库名 < db.sql
chown -R www:www .
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod -R 775 runtime data

搬完往下看,按你的情况挑一节做。


情况 A:换了域名#

适用:域名换了,比如老域名不用了,改用新域名。

A-1 改数据库连接#

只改 data/database.config.php 这一个文件。

写法看这一章靠后的「怎么改数据库连接」。

A-2 改域名配置#

改这个文件:data/site.config.php

Shell
vi data/site.config.php

全文改成下面这样(把 cc.zx15.com 换成你的新域名):

PHP
<?php
/**
 * aucms - 站点配置
 *
 *  app.url ------- 固定站点域名,所有链接以它为准
 *  trusted_hosts - 主机白名单(新域名必须写在这里)
 *  cache.prefix -- 缓存键前缀(同机多站必须各不相同)
 */

return array(
    'app' => array(
        'url' => 'https://cc.zx15.com',
    ),
    'cache' => array(
        'prefix' => 'cczx15com:',
    ),
    'security' => array(
        'trusted_hosts' => array(
            'cc.zx15.com',
        ),
    ),
);
这一行作用改错了会怎样
app.url规范域名。sitemap、canonical、分页、邮件里的链接全用它站内链接还指向旧域名
trusted_hosts允许哪些域名访问本站漏了新域名 → 自己把自己 403 挡在外面
cache.prefix缓存键的名字前缀同机两个站重名 → 缓存串站

⚠️ 最大的坑:新域名必须写进 trusted_hosts#

系统只在 trusted_hosts 为空时,才自动把 app.url 的域名加进去。

你一旦手动写了白名单,它就不再自动补:

code
app.url        = https://cc.zx15.com
trusted_hosts  = ['zz.zx15.com']     ← 忘了加新域名

→ 用 https://cc.zx15.com 访问 = 403「非法的访问域名」

换域名后,新域名一定也要写进白名单里。

A-3 让旧域名跳到新域名#

白名单里删掉旧域名,访问它会直接 403,搜索引擎收录的老链接会全部失效。

正确做法是在 nginx 层做 301:

Nginx
server {
    listen 80;
    server_name zz.zx15.com www.zz.zx15.com;
    return 301 https://cc.zx15.com$request_uri;
}

贴进 Nginx 站点配置 → 保存 → 重载。

跳转后传到 PHP 的已经是新域名,所以不需要把旧域名加回白名单。

老域名不要了?跳过这一步就行。

A-4 清掉正文里的旧域名#

文章正文里如果存过完整的旧域名链接(图片、附件),换域名后它们还会指向旧站。

先查有多少:

Shell
mysql -u 用户 -p -e "SELECT id, title FROM aucms_content WHERE content LIKE '%zz.zx15.com%'" 库名

有结果就批量替换(先备份):

Shell
mysqldump -u 用户 -p 库名 > before-replace.sql
mysql -u 用户 -p -e "UPDATE aucms_content SET content = REPLACE(content, 'https://zz.zx15.com', 'https://cc.zx15.com')" 库名

A-5 收尾#

  1. DNS 把新域名解析到新服务器 IP
  2. 清缓存 → 看 缓存怎么清、缓存名怎么改
  3. 做完再去刷「搬完怎么验收」

情况 B:域名不变#

适用:换了服务器、机房、IP,但域名还是原来那个。

B-1 改数据库连接#

只改 data/database.config.php。

写法看这一章靠后的「怎么改数据库连接」。

例外:新服务器的库名、账号、密码跟旧服务器完全一样 → 不用改, 直接从 B-2 开始。

B-2 不用动域名配置#

data/site.config.php 一个字都不用改。

code
域名没变,app.url / trusted_hosts 就都还是对的。

B-3 只有这一种情况要改缓存名#

新服务器上跑了多个站、共用一个 Redis 时才需要:

条件要不要改
新服务器只跑这一个站不用改
新服务器跑多个站,各用各的 Redis不用改
新服务器跑多个站,共用一个 Redis改,每个站一个名字

怎么改 → 看 怎么改缓存名

B-4 切解析 + 收尾#

  1. DNS 把域名解析改到新服务器 IP
  2. 等解析生效(ping 你的域名,看 IP 是不是新的)
  3. 清缓存 → 看 缓存怎么清、缓存名怎么改
  4. 做完再去刷「搬完怎么验收」

情况 C:只换数据库账号密码#

适用:服务器没动,只是改了 MySQL 密码、或换了个数据库账号。

C-1 只改这一个文件#

Shell
vi data/database.config.php

只改这三行,别的都不动:

PHP
'database' => '你的库名',
'username' => '你的账号',
'password' => '你的新密码',

C-2 验证#

Shell
php aucms db:check

看到 "连接 成功" 就对了。

C-3 清缓存#

Shell
php aucms cache:clear

C-4 其他都不用动#

文件要不要改
data/site.config.php不用(域名没变)
config/database.php不用(会被覆盖)
域名解析不用
Nginx 配置不用

怎么改数据库连接#

只改这一个文件:data/database.config.php

用 MySQL 的话,全文改成下面这样(把中文替换成你的):

PHP
<?php
return array(
    'default' => 'mysql',
    'prefix'  => 'aucms_',
    'connections' => array(
        'mysql' => array(
            'driver' => 'mysql',
            'write'  => array(
                'host'     => '127.0.0.1',
                'port'     => 3306,
                'database' => '你的库名',
                'username' => '你的账号',
                'password' => '你的密码',
                'charset'  => 'utf8mb4',
            ),
        ),
    ),
);

用 SQLite(不用装数据库)的话:

PHP
<?php
return array(
    'default' => 'sqlite',
    'prefix'  => 'aucms_',
    'connections' => array(
        'sqlite' => array(
            'driver' => 'sqlite',
            'write'  => array('database' => 'data/aucms.db'),
        ),
    ),
);

改完必跑(看到 "连接 成功" 才继续):

Shell
php aucms db:check

⚠️ 两个必踩的坑#

坑 1:别只改 config/database.php

config/database.php 是参考模板(写着所有选项的说明)。 只要 data/database.config.php 存在,它就会覆盖前者。

你在 config 里改半天密码,一点用都没有。

想只留一个配置文件?把 data/database.config.php 删掉(先备份), 再改 config/database.php。

坑 2:prefix(表前缀)必须跟库里一致

code
prefix 写成 'nova_',库里表名却是 'aucms_content'
→ 报 "表不存在"

不确定前缀是什么?去库里看一眼表名:

Shell
mysql -u 用户 -p -e "SHOW TABLES" 库名 | head -5

搬完怎么验收#

全部 200 才算通。

Shell
BASE=https://你的域名
for u in / /list/news /article/1.html /sitemap.xml /robots.txt /admin/login; do
  printf "%-30s %s\n" "$u" "$(curl -s -o /dev/null -w '%{http_code}' $BASE$u)"
done

再看这四样:

检查怎么看
链接是新的(情况 A)随便打开一篇文章,看地址栏
图片没裂首页和详情页刷一遍
后台能存后台改个站名,保存,刷新看还在不在
密钥在ls -l data/secret.key

对不上? → 看 排错手册


最容易翻车的 5 个点#

症状原因
登录不上、数据乱码data/secret.key 没带过来
改了密码还是连不上库只改了 config/database.php,没改 data/database.config.php
报"表不存在"prefix 表前缀跟库里不一致
清完缓存整页 500root 跑了 cache:rebuild,没 chown 回来
新域名 403trusted_hosts 里漏了新域名
没找到答案? 在后台「缓存与维护 → 系统体检」里看环境是否正常;仍无解就打开 server_debug.php 复现一次,页面会直接告诉你异常文件与行号。