在WordPress站点中如何通过PHP捕获Nginx重写前的原始绑定域名?
可行实现方案
前置校验:确认可获取的原始域名服务器变量
主机商做NGINX内部重写(非3xx跳转)的场景下,通常不会清空原始请求的相关头信息,你可以先通过插件输出PHP超全局变量排查可用字段:
- 常见的存储原始请求域名的
$_SERVER字段包括:$_SERVER['HTTP_X_ORIGINAL_HOST']:多数主机做域名重写时会保留的自定义头,存储原始请求Host$_SERVER['HTTP_HOST']:如果NGINX没有强制覆盖Host头,该字段会直接保留原始请求域名$_SERVER['HTTP_X_FORWARDED_HOST']:反向代理场景下常用的原始Host存储字段
- 测试代码可以挂在WordPress的
init钩子中,仅管理员可见避免影响普通用户:
add_action('init', function() { // 仅管理员执行输出 if (current_user_can('manage_options')) { echo '<pre>'; // 打印所有服务器变量,查找包含你第二个域名的字段键名 print_r($_SERVER); echo '</pre>'; exit; } });
正式实现:捕获原始域名并做业务处理
排查到对应的存储字段后,你可以封装通用方法全局获取原始域名,用于后续业务逻辑:
/** * 获取请求的原始域名 * @return string 原始域名 */ function get_original_request_domain() { // 替换成你实际排查到的存储原始域名的$_SERVER键名 $domain_source_keys = [ 'HTTP_X_ORIGINAL_HOST', 'HTTP_HOST', 'HTTP_X_FORWARDED_HOST' ]; foreach ($domain_source_keys as $key) { if (isset($_SERVER[$key]) && !empty($_SERVER[$key])) { $raw_domain = sanitize_text_field($_SERVER[$key]); // 过滤掉可能存在的端口号 return strtok($raw_domain, ':'); } } // 兜底逻辑:返回站点默认主域名 return parse_url(get_home_url(), PHP_URL_HOST); }
调用get_original_request_domain()即可拿到当前请求的原始域名,后续可以基于该值做内容差异化、链接重写、权限控制等任意业务处理。
特殊场景兼容(NGINX使用3xx跳转的情况)
如果主机商是通过301/302跳转把第二个域名的请求转到主域名,而非内部重写,跳转后的请求不会携带原始头信息,可通过以下方案处理:
- 如果你能配置第二个域名的跳转规则,可以在跳转时追加参数标记,比如访问
second-domain.com/xxx时跳转到main-domain.com/xxx?from_domain=second-domain.com,在插件中获取$_GET['from_domain']后存入用户Cookie或Session,后续请求都可以读取该标记 - 无法修改跳转规则的话,可以通过
$_SERVER['HTTP_REFERER']辅助判断来源域名,该字段可靠性较低,仅可作为补充方案
内容的提问来源于stack exchange,提问作者DonCoryon
相关产品推荐
相关产品推荐

