解决 WordPress 评论显示真实访客 IP 的问题:反向代理配置总结

在使用反向代理将本地的 WordPress 网站通过代理机暴露到公网时,遇到了一个问题:WordPress 无法显示访客的真实 IP 地址,而是显示了代理服务器的公网 IP。

经过一番排查,终于找到了一个解决方案,下面是我的解决过程和环境配置总结。

环境配置

  • 本地服务器:一台运行 WordPress 的本地服务器。
  • 反向代理服务器:一台部署了 Nginx 反向代理的公网服务器(宝塔),使用 Tailscale 搭建虚拟内网,反向代理通过该公网 IP 将流量转发到本地服务器。

问题分析

反向代理通常会导致客户端的真实 IP 地址被隐藏,代理服务器的公网 IP 会被记录为访问者的 IP。在 WordPress 的评论功能中,访客的 IP 地址会被用于反垃圾邮件和评论过滤等功能,代理后的 IP 地址导致评论管理功能不准确。

解决方案

  1. 确保反向代理传递真实 IP
    在 Nginx 配置中,我们需要正确设置 X-Forwarded-ForX-Real-IP 头部,以便将客户端的真实 IP 传递给后端服务器(即 WordPress)。在 Nginx 配置文件中,添加以下两端指令:

    #PROXY-CONF-START
    location ^~ / {
    ...
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    ...
    }

    这些配置确保了代理服务器将真实访客的 IP 地址传递给 WordPress 后端。

  2. 修改 WordPress 以解析 X-Forwarded-For 头部
    由于 WordPress 默认使用 $_SERVER['REMOTE_ADDR'] 获取访客 IP 地址,而反向代理会修改此值,因此需要确保 WordPress 能正确读取 X-Forwarded-For 头部中的真实 IP。在 wp-config.php 文件中添加以下代码,以确保 WordPress 从 X-Forwarded-For 中提取正确的访客 IP:

    // 确保 WordPress 正确读取 X-Forwarded-For 头部的真实 IP
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $ips[0]; // 使用最前面的IP作为访客的真实IP
    }

    这段代码将会检查 X-Forwarded-For 头部,并将最前面的 IP 地址(即客户端的真实 IP)设置为 $_SERVER['REMOTE_ADDR'],从而让 WordPress 正确显示访客的 IP。

总结

通过正确配置 Nginx 反向代理头部以及修改 WordPress 的 wp-config.php,成功解决了显示评论者真实 IP 的问题。以下是关键步骤:

  1. 配置 Nginx 反向代理时确保传递 X-Forwarded-ForX-Real-IP 头部(宝塔Nginx反代默认会自动生成)。
  2. 修改 wp-config.php 文件,使 WordPress 正确解析代理传递的 IP 地址。

这样,WordPress 评论中显示的访客 IP 就不再是代理服务器的 IP,而是用户的真实 IP。