WP环回请求失败(cURL error 52)修复
问题
在 WordPress 后台【工具 → 站点健康】中出现如下错误:
错误:cURL error 52: Empty reply from server(http_request_failed)
该错误意味着:
服务器无法通过 HTTP/HTTPS 访问自己的网站域名。
直接影响功能包括:
- WP-Cron 定时任务(缓存自动清理等)
- 插件/主题在线更新
- REST API
问题排查
curl http://localhost
→ 301 Moved Permanently
Location: https://localhost/
curl -Iv https://localhost
→ 证书 CN = xxx.com
→ subjectAltName does not match localhost
curl https://atmoyu.com/wp-cron.php?doing_wp_cron
curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
才想起我的服务器设置了默认站点并开启了强制ssl,用于防止类似censys的程序扫描到我真实网站泄露ip。
这是一个经典的:
多站点服务器 + HTTPS + default_server + 未设置 hosts
导致的 内部请求命中错误虚拟主机 的问题。
问题分析
WordPress
↓
访问 https://atmoyu.com
↓
服务器未在 /etc/hosts 中找到映射
↓
向公网 DNS 查询
↓
解析得到服务器公网 IP
↓
连接 公网IP:443
↓
Nginx 在 TLS 阶段尚未获得有效 SNI
↓
命中 default_server
↓
返回 默认站点 的证书
↓
证书与 atmoyu.com 不匹配
↓
TLS 握手失败
↓
cURL error 52
为什么会命中 默认站点?
HTTPS 与 HTTP 的关键差异
- HTTP:
- 先连接
- 再发送 Host 头
- HTTPS:
- 先 TLS 握手
- 再发送 HTTP 请求
在 TLS 阶段,服务器必须先选择证书。
如果没有可匹配的 SNI(Server Name Indication),Nginx 只能回退到:
default_server
为什么浏览器直接访问没问题?
客户端电脑访问:
atmoyu.com → 公网 DNS → 公网IP → Host: atmoyu.com
Nginx 可以根据 Host 命中正确虚拟主机。
而服务器访问自己时路径不同,导致走偏。
修复方案
在服务器中建立本地域名映射
编辑:
nano /etc/hosts
添加:
127.0.0.1 atmoyu.com
::1 atmoyu.com
问题即可解决
防止服务器重启后host重置
找到cloud.cfg,通常在/etc/cloud中。
删除以下内容
- set_hostname
- update_hostname
- update_etc_hosts
验证结果
curl -Iv https://atmoyu.com
输出:
SSL certificate verify ok.
HTTP/2 200
修复后的正确链路
WordPress
↓
访问 https://atmoyu.com
↓
/etc/hosts 命中 127.0.0.1
↓
连接本机 443
↓
TLS ClientHello 携带 SNI = atmoyu.com
↓
Nginx 命中 atmoyu.com 虚拟主机
↓
返回 atmoyu.com 证书
↓
SSL 校验通过
↓
HTTP 200
「摸鱼小屋」 (atmoyu.com)版权所有,引用、转载时必须标明原文出处!







空空如也!