You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:37:07