本文约 3,878 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:上线当天发现表单发不出邮件
某机械公司新站周五下午上线,周一上午销售打电话问”怎么一个询盘都没有”。技术一查,表单提交后提示”发送成功”,但邮件根本没到——服务器没配 SMTP,wp_mail() 调用 PHP mail() 静默失败。一个周末的推广预算全打水漂,而且问题本可以在上线前用一分钟的自助测试发现。
网站上线是”一次性不可逆体验”最密集的时刻:首页第一次被客户看到、第一次被搜索引擎抓取、第一次被分享到微信群。这个时点上的错误代价远高于平时。但现实中大多数团队没有验收清单,靠的是”看起来没问题”这种主观判断。把验收项写下来逐条打勾,是成本最低、收益最高的工程习惯。
原理分析:为什么上线前的问题特别容易漏
上线前的问题有三个共性特征:第一,测试环境和生产环境不一致,本地能发出的邮件、能跳转的支付回调,上线后因为域名、IP、防火墙规则变化而失效;第二,很多功能是”异步”的,邮件、定时任务、统计上报都不会在页面上立刻体现,不主动验证就看不出异常;第三,权限相关的问题在管理员账号下看不出来,用访客身份才暴露。
因此清单设计要遵循三条原则:一是每个验收点必须可判定(能回答”是/否”),二是尽量用命令或工具自动验证而不是肉眼,三是用”访客视角”(无痕窗口、退出登录、手机网络)复核一遍。
| 检查维度 | 关键验收点 | 自动化程度 |
|---|---|---|
| 内容 | 无 Lorem ipsum、无占位图片、联系方式正确 | 半自动 |
| 表单 | 提交成功、邮件到达、记录入库、垃圾防护 | 手工 |
| SSL | 证书有效、全站 HTTPS、无混合内容 | 自动 |
| 备案 | 备案号可点击、公安备案、主体一致 | 手工 |
| 统计 | GA4 / 百度统计 / Search Console 验证 | 半自动 |
| 性能 | 首屏时间、图片体积、缓存生效 | 自动 |
| 安全 | 后台登录限制、备份、文件权限 | 半自动 |
保姆级实操
步骤 1:内容与链接检查。 全站搜索占位文案,并跑一遍死链。
cd /var/www/mimangfei
# 1. 在数据库里找占位内容
wp search-replace --dry-run 'Lorem ipsum' '' --all-tables --report-changed-only
# 2. 列出草稿与待审内容,确认没有半成品被发布
wp post list --post_status=draft,pending --fields=ID,post_title,post_type
# 3. 检查是否存在指向测试域名的残留链接
wp search-replace --dry-run 'staging.example.com' 'mimangfei.com' --all-tables
步骤 2:SSL 与混合内容检查。 证书没问题是第一步,页面里还有 http:// 资源才是混合内容警告的主因。
# 查看证书有效期与颁发者
echo | openssl s_client -connect mimangfei.com:443 -servername mimangfei.com 2>/dev/null \
| openssl x509 -noout -dates -issuer
# 检查 HTTP 是否 301 跳转到 HTTPS
curl -sI http://mimangfei.com | head -n 5
# 检查响应头里的安全头
curl -sI https://mimangfei.com | grep -iE 'strict-transport|x-frame-options|x-content-type'
页面层面用浏览器控制台看 Console 是否有 “Mixed Content: The page at … was loaded over HTTPS but requested an insecure …” 提示,再用 Better Search Replace 插件把库里残留的 http:// 批量替换掉。
步骤 3:把 HTTP 强制跳转与 HSTS 落到服务器层。 用 wp-config.php 常量兜底,比改数据库更稳。
// wp-config.php:后台与登录页强制 HTTPS
define( 'FORCE_SSL_ADMIN', true );
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) {
$_SERVER['HTTPS'] = 'on';
}
# nginx:全站 301 到 HTTPS,并开启 HSTS
server {
listen 80;
server_name mimangfei.com www.mimangfei.com;
return 301 https://mimangfei.com$request_uri;
}
server {
listen 443 ssl http2;
server_name mimangfei.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# ...ssl_certificate 等配置
}
步骤 4:表单端到端测试。 准备一个可丢弃的测试邮箱,按下面的顺序验证:提交空表单(应报错)、提交正确数据(应显示成功)、查邮箱(应收到通知邮件)、查后台 Flamingo / WPForms 记录(应有条目)、再提交 5 次(应触发限流或验证码)。任一步不通都要在上线前解决。
步骤 5:统计与站长平台接入。 GA4 用 Google Site Kit 插件或直接插入 gtag;百度统计与百度搜索资源平台分开配置。验证站点归属后再提交 sitemap。
# 确认 sitemap 可访问且返回 200
curl -s -o /dev/null -w '%{http_code}\n' https://mimangfei.com/wp-sitemap.xml
curl -s -o /dev/null -w '%{http_code}\n' https://mimangfei.com/sitemap_index.xml
# 确认 robots.txt 没有误屏蔽全站
curl -s https://mimangfei.com/robots.txt
步骤 6:安全与备份验收。 确认 UpdraftPlus 已配置远程备份目标,Wordfence 或同类 WAF 已开启,后台登录有失败次数限制,并且 wp-config.php 里 DISALLOW_FILE_EDIT 已开启。
// wp-config.php
define( 'DISALLOW_FILE_EDIT', true );
define( 'WP_POST_REVISIONS', 10 );
define( 'AUTOSAVE_INTERVAL', 300 );
步骤 7:临时关闭搜索引擎索引。 如果还在调试,先在”设置 → 阅读”勾选”建议搜索引擎不索引本站点”,上线当天记得取消勾选——这是最容易忘记的一步。
常见踩坑
- 上线后 “Error establishing a database connection”,因为
wp-config.php里数据库主机还是localhost而生产环境是独立 RDS 地址。 - 表单提示成功但收不到邮件,SMTP 未配置(必须装 SMTP 插件)。
- 全站 CSS 404,因为
home/siteurl还指向临时域名,需wp option update home 'https://mimangfei.com'。 wp search-replace直接跑生产库且没备份,序列化数据被破坏后小工具全丢(先--dry-run再执行,并备份)。- 忘记取消”不索引本站点”,上线一个月后才发现零收录。
- 案例:某站上线前把测试环境的
noindex保留了下来,同时又在站长平台提交了 sitemap。等两个月后发现收录量为 0,返工排查时才发现根本原因。由于错过了产品旺季,推广排期整体延后了一个季度。 - 上传目录权限设成 777,被上传了后门脚本。
- 只测了管理员视角,没在退出登录状态下验证表单,忽略了验证码拦截。
- 没配自动备份,上线后一次误操作删了整站数据无法回滚。
总结
上线的判断标准只有一条:用无痕窗口、手机 4G 网络,以普通访客身份走完”打开首页 → 浏览产品 → 提交表单 → 收到邮件”的完整路径,全程无报错。行动清单:① 内容和链接无占位残留;② 表单端到端验证通过;③ HTTPS、HSTS、无混合内容;④ 备案信息与主体一致;⑤ sitemap 可访问且 robots.txt 正确;⑥ 备份与 WAF 就绪;⑦ 上线当天取消 noindex。更多上线后的运营细节可配合 企业站新闻栏目 SEO、企业站信任要素与合规展示 与 WordPress 网站备份方案 一起执行。
