WordPress向私有IP发POST请求,Nginx日志为何显示来源为testdev.com?
问题分析:为何Nginx日志显示请求来自testdev.com而非dev.com?
问题背景
我在WordPress中编写了一个函数,用于向私有IP段的特定Web服务器(定义为ALLOWED_SERVERS)发送POST请求,这些服务器部署在负载均衡器之后。但在https://dev.com上更新文章时,请求出现异常。
代码实现
define( 'ALLOWED_SERVERS', [ '192.168.0.1', '192.168.0.2', ] ); function create_purge_request_data($server_ip): array { $url = parse_url(home_url()); return [ 'url' => "{$url['scheme']}://{$server_ip}/wp-json/cache/v1/purge/", 'type' => 'POST', 'headers' => [ 'Content-Type' => 'application/json', 'Host' => $url['host'] ], 'data' => json_encode(['host' => $url['host']]) ]; } function send_purge_cache_request() { $request_data = array_map('create_purge_request_data', ALLOWED_SERVERS); Requests::request_multiple($request_data); } add_action('post_updated', 'send_purge_cache_request');
异常日志情况
服务器192.168.0.1的Nginx日志
请求来源IP变为该服务器公网IP(本该是内网IP 192.168.0.1),请求URL变为https://testdev.com//wp-json/cache/v1/purge/:
0.245 101.108.225.123 - - [02/Aug/2023:17:48:50 +0900] "POST //wp-json/cache/v1/purge/ HTTP/1.1" 404 164 "https://testdev.com//wp-json/cache/v1/purge/" "php-requests/1.7-3470169" "-" "-" "testdev.com"
服务器192.168.0.2的Nginx日志
Host字段显示为testdev.com,而非预期的dev.com:
0.000 192.168.0.1 - [01/Aug/2023:14:20:48 +0900] "POST /wp-json/cache/v1/purge/ HTTP/1.1" 301 162 "http://192.168.0.2/wp-json/cache/v1/purge/" "php-requests/1.7-3470169" "-" "-" "testdev.com" "-"
核心问题
为何Nginx日志中显示请求来自testdev.com,而非代码中设定的实际来源dev.com?
原因分析与解决方案
1. home_url()返回值不符合预期
你的代码依赖home_url()获取站点域名,但如果服务器的WordPress配置(wp-config.php里的WP_HOME/WP_SITEURL)、服务器hosts文件或Nginx站点配置中,把当前服务器的域名设置成了testdev.com,home_url()就会返回这个错误域名,导致请求Header的Host字段和请求体的host参数都变成testdev.com,最终被Nginx日志记录。
2. 内网请求被路由到公网(服务器1的情况)
服务器1的请求来源显示为公网IP,说明服务器没有配置正确的内网路由规则,本该走内网的请求被转发到公网,经过负载均衡器后再回到服务器,所以日志里的来源IP变成了公网IP。同时因home_url()返回错误域名,请求URL被拼接成带双斜杠的错误格式。
3. 修复方案
- 强制获取正确的当前域名:不要依赖
home_url(),直接从当前请求的Header里获取真实Host,或者硬编码目标域名:function create_purge_request_data($server_ip): array { // 从当前请求获取真实的Host和协议 $current_host = $_SERVER['HTTP_HOST']; $scheme = is_ssl() ? 'https' : 'http'; return [ 'url' => "{$scheme}://{$server_ip}/wp-json/cache/v1/purge/", 'type' => 'POST', 'headers' => [ 'Content-Type' => 'application/json', 'Host' => $current_host ], 'data' => json_encode(['host' => $current_host]) ]; } - 检查服务器路由配置:确保服务器访问192.168.0.0/16段IP时走内网接口,禁止请求绕到公网出口,解决来源IP异常问题。
- 验证WordPress配置:检查
wp-config.php中的WP_HOME和WP_SITEURL是否正确设置为https://dev.com,避免home_url()返回错误域名。
内容的提问来源于stack exchange,提问作者sen
相关产品推荐
相关产品推荐

