网站搬到新服务器后,很多人会先修改域名解析,再打开浏览器检查是否正常。
如果这时才发现证书不匹配、网站跳转错误,或者后台无法连接数据库,就可能影响正在访问网站的用户。
实际上,即使公共DNS仍然指向旧服务器,也可以提前使用原来的域名测试新服务器。
本文介绍一种实用方法:通过 curl --resolve 指定连接的新IP,同时保留网站域名,检查HTTPS证书、页面响应和跳转情况。
1. 为什么不能只打开新服务器IP?
一台服务器可能同时运行多个网站,Web服务需要根据请求中的域名选择站点。
对于HTTPS网站,还涉及TLS握手中的SNI和证书域名校验。
因此,直接访问:
https://新服务器IP/
可能打开默认站点,也可能出现证书不匹配,不能据此判断原来的域名站点是否配置正确。
即使手动添加HTTP的 Host 请求头,也不能完整替代HTTPS中的域名信息。curl会根据URL中的主机名设置SNI。
使用 --resolve,可以让curl连接指定IP,同时继续按URL中的域名发送SNI并验证证书。
它只改变本次命令的连接目标,不会修改公共DNS记录。

2. 准备域名、新IP和curl
开始前,需要确认:
- 新服务器已经部署网站,并配置实际使用的域名。
- 新服务器已经配置与域名匹配的HTTPS证书。
- 测试电脑能够连接新服务器的HTTPS端口。
- 已经知道新服务器的实际IP。
本文使用以下示例:
| 项目 | 示例值 |
|---|---|
| 网站域名 | www.example.com |
| 新服务器IPv4地址 | 203.0.113.10 |
| HTTPS端口 | 443 |
示例域名和IP必须替换成自己的实际信息。
建议从自己的电脑,或另一台能够访问新服务器的机器发起测试。只在新服务器上测试本机,不能完整验证外部访问路径。
在Linux终端检查curl:
curl --version
Debian或Ubuntu尚未安装时,可以执行:
sudo apt-get update
sudo apt-get install -y curl ca-certificates
如果新服务器还没有配置HTTPS,可以先参考本站:
迁移到莱卡云Linux云服务器时,也可以先完成网站部署和指定IP测试,再安排正式切换。
查看官网购买链接: https://www.lcayun.com
9折优惠码:bloglcayun
3. 指定新IP测试HTTPS网站
下面的多行命令适用于Linux、macOS或WSL中的Bash终端。
先设置实际域名和新IP,后续命令在同一个终端执行:
domain='www.example.com'
new_ip='203.0.113.10'
然后发送请求:
curl -q --noproxy '*' \
--resolve "${domain}:443:${new_ip}" \
--connect-timeout 5 \
--max-time 20 \
-sS -D - -o /dev/null \
-w '\nConnected IP: %{remote_ip}\nHTTP: %{http_code}\n' \
"https://${domain}/"
这条命令会实际请求网站首页,显示响应头、连接IP和HTTP状态码,页面正文则被丢弃。
主要参数的作用如下:
| 参数 | 作用 |
|---|---|
-q | 放在第一个参数位置,避免读取默认curl配置文件 |
--noproxy '*' | 本次请求不经过curl配置或环境变量指定的代理 |
--resolve | 为指定的域名和端口提供连接IP |
--connect-timeout 5 | 连接建立阶段最多等待5秒 |
--max-time 20 | 整个请求最多运行20秒 |
-D - | 将响应头显示在终端 |
-o /dev/null | 丢弃下载的正文 |
-w | 请求结束后输出连接信息 |
--resolve 的格式是:
域名:端口:IP
其中端口必须与请求URL对应。HTTPS默认使用443;如果实际网站使用8443,就需要同时修改映射中的端口和URL中的端口。
该参数按域名与端口匹配,也可以在一条命令中提供多项映射。
Windows PowerShell怎么执行?
可以使用下面的单行命令,替换其中的域名和IP:
curl.exe -q --noproxy "*" --resolve "www.example.com:443:203.0.113.10" --connect-timeout 5 --max-time 20 -sS -D - -o NUL -w "\nConnected IP: %{remote_ip}\nHTTP: %{http_code}\n" "https://www.example.com/"
这里明确使用 curl.exe,避免与部分PowerShell版本中的同名别名混淆。
4. 返回结果怎么看?
首先检查:
Connected IP
它应当是本次指定的新服务器IP。
然后检查HTTP状态码、响应头和curl是否报告错误。-w 输出的信息来自实际传输,可用来辅助判断请求连接到了哪里。
| 结果 | 通常说明什么 | 下一步 |
|---|---|---|
HTTP 200 | 请求获得正常响应 | 继续核对页面内容 |
HTTP 301、302 | 网站要求跳转 | 查看 Location |
HTTP 401、403 | 需要认证或访问被拒绝 | 检查登录要求和访问规则 |
HTTP 404 | 请求资源未找到 | 检查站点匹配、目录和路径 |
HTTP 502 | 网关或代理未得到正常上游响应 | 检查后端程序与连接 |
curl错误 7 | 未能连接目标主机或端口 | 检查服务监听、地址和网络 |
curl错误 28 | 某个阶段达到超时时间 | 结合错误文字判断连接还是响应超时 |
curl错误 60 | 服务器证书校验失败 | 检查证书域名、有效期、证书链和信任 |
curl的退出状态和HTTP状态码不是同一件事。 默认情况下,收到404等HTTP响应,curl也可能正常完成传输并返回退出码0。
如果输出HTTP 000,表示没有取得有效的HTTP响应状态码,应先查看curl同时报告的错误。
证书报错后,要不要加-k?
不要把添加 -k 后能够访问,当成HTTPS已经配置正确。
-k 会跳过服务器证书校验,而网站迁移前恰恰需要确认这部分是否正常。
curl默认会检查证书信任和URL中的域名。若使用内部CA,应通过可信来源取得对应CA证书,并使用 --cacert 等方式建立正确的信任关系。
如果源站使用只供CDN回源验证的证书,普通客户端直接访问时可能不信任它,需要按实际证书体系判断。
证书部署与返回结果不一致时,可以继续参考本站:
SSL证书更新后仍显示旧证书怎么办?Nginx与CDN排查教程
5. 遇到301或302跳转怎么处理?
第3节的命令没有添加 -L,因此不会自动跟随跳转。
这样可以先看清响应头里的:
Location
例如网站可能将:
https://example.com/
跳转到:
https://www.example.com/
这两个是不同的主机名。只给其中一个配置 --resolve,并不会自动覆盖另一个。
如果直接加 -L 跟随,后续请求就可能按正常解析结果访问旧服务器,造成“新服务器已经测试通过”的误判。
确认跳转域名符合预期后,可以为两个域名分别指定映射:
root_domain='example.com'
curl -q --noproxy '*' \
--resolve "${root_domain}:443:${new_ip}" \
--resolve "${domain}:443:${new_ip}" \
--connect-timeout 5 \
--max-time 20 \
-L --max-redirs 5 \
-sS -D - -o /dev/null \
-w '\nFinal URL: %{url_effective}\nFinal IP: %{remote_ip}\nHTTP: %{http_code}\n' \
"https://${root_domain}/"
其中 root_domain 也需要替换成实际裸域名,domain 沿用前面设置的带www域名。
-L 用于跟随跳转,--max-redirs 5 限制最多跟随5次。
如果实际跳转涉及其他域名或不同端口,需要分别确认对应目标。
上面的 Final IP 显示最终连接的信息,不能代替对中间每一步跳转的检查。需要进一步排查时,可以增加 -v 查看连接过程。
6. 对比当前入口与新服务器
在同一个测试环境中,去掉 --resolve,可以查看域名按当前解析配置访问时的结果:
curl -q --noproxy '*' \
--connect-timeout 5 \
--max-time 20 \
-sS -D - -o /dev/null \
-w '\nConnected IP: %{remote_ip}\nHTTP: %{http_code}\n' \
"https://${domain}/"
再与第3节指定新IP的结果比较。
| 对比结果 | 判断方向 |
|---|---|
| 当前入口正常,新IP失败 | 优先检查新服务器部署、证书和访问规则 |
| 两边都正常,但连接IP不同 | 可能符合迁移前的预期,还需核对内容和数据 |
| 新IP正常,当前入口异常 | 检查当前入口对应的旧服务器、CDN或解析配置 |
| 两边都异常 | 分别记录错误,检查公共依赖和测试网络 |
如果域名接入了CDN,普通访问连接到的可能是CDN节点,而不是旧服务器本身。
指定源站IP测试成功,只能说明这条直连路径通过了相应检查,不能证明CDN缓存、回源规则和边缘证书也已正常。
如果源站原本只允许CDN节点访问,测试电脑直连被拒绝也可能是预期行为。应按既有访问策略安排测试,不要为了测试关闭整套防护。
7. 返回200以后,还需要检查什么?
HTTP返回200,不代表网站迁移已经全部完成。
还应检查页面内容、关键接口和实际业务数据。
例如,可以把首页正文保存下来:
curl -q --noproxy '*' \
--resolve "${domain}:443:${new_ip}" \
--connect-timeout 5 \
--max-time 20 \
-sS -o migration-test-page.html \
"https://${domain}/"
确认命令成功后,再查看保存的内容是否属于正确的网站,避免实际返回的是默认页面或应用错误提示。
此外还应验证:
- 关键栏目和页面能否打开。
- 图片、CSS和JavaScript资源是否使用正确地址。
- 应用能否连接预期的数据库。
- 后台登录、文件上传等必要功能是否正常。
- 域名和HTTPS跳转是否符合预期。
curl不会执行网页中的JavaScript,也不会自动加载页面引用的全部资源,完整功能仍需要浏览器或应用测试配合。
在测试环境中验证写入功能时,应使用测试账号和测试数据,避免误触发正式订单、邮件或其他业务操作。
如果新服务器返回502,可以参考本站:
Nginx出现502 Bad Gateway怎么办?常见原因与排查教程
正式切换时,数据库增量同步、写入切换和定时任务等工作也要单独安排。修改解析后,还应检查A、AAAA记录或CDN回源设置是否与迁移方案一致。
8. 结语
网站迁移前,可以通过 curl --resolve 指定新服务器IP,在保留原域名和HTTPS证书校验的情况下,提前检查新环境。
测试时重点确认连接IP、证书、HTTP状态和跳转目标,再继续验证页面内容与业务功能。
先把新环境检查清楚,再安排解析或回源切换,能减少网站正式迁移后的故障排查时间。








