$_SERVER['REQUEST_URI']返回父目录而非子目录的技术问题求助
$_SERVER['REQUEST_URI']路径不正确的问题 这个问题在反向代理映射的场景里很常见——当客户把company.com/sub-company/指向WP Engine的演示站点时,$_SERVER['REQUEST_URI']拿到的是WP Engine服务器实际接收的路径(也就是去掉了/sub-company/前缀的部分),而不是用户访问的完整路径。这是因为反向代理服务器只会把子目录后面的内容转发给WP Engine站点,导致原生的服务器变量无法捕获到原始请求的完整路径信息。
下面给你几个实用的解决方案:
1. 利用代理转发头重建完整路径
WP Engine处理反向代理请求时,会把原始请求的完整URI和域名分别存在HTTP_X_FORWARDED_URI和HTTP_X_FORWARDED_HOST这两个服务器变量里。你可以修改重定向函数,优先使用这些变量:
// 优先取代理转发的完整URI,没有的话再 fallback 到默认的REQUEST_URI $referrer = !empty($_SERVER['HTTP_X_FORWARDED_URI']) ? $_SERVER['HTTP_X_FORWARDED_URI'] : $_SERVER['REQUEST_URI']; // 如果需要拼接完整的URL(包含域名),可以这样处理 $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http'; $full_referrer = $protocol . '://' . $_SERVER['HTTP_X_FORWARDED_HOST'] . $referrer;
这样就能获取到用户实际访问的/sub-company/xxx路径,而不是WP Engine内部接收到的/xxx路径。
2. 强制WordPress使用正确的站点URL
让WordPress明确知道自己的实际访问地址是http://company.com/sub-company/,这样所有内置的路径生成函数都会基于这个地址工作,从根源上避免路径混乱。
- 推荐直接在
wp-config.php里添加配置(不受后台设置变动影响):
define('WP_HOME', 'http://company.com/sub-company/'); define('WP_SITEURL', 'http://company.com/sub-company/');
- 也可以登录WordPress后台,在「设置-常规」中把「站点地址(URL)」和「WordPress地址(URL)」都设置为
http://company.com/sub-company/
修改完成后记得清除WP Engine的缓存(在WP Engine控制面板操作),缓存可能会保留旧的路径配置,导致修改不生效。
3. 用WordPress内置函数替代原生$_SERVER变量
不要直接依赖$_SERVER这类原生变量,WordPress提供了很多适配站点配置的内置函数,即使在反向代理场景下也能准确获取路径:
// 获取当前页面的完整URL global $wp; $current_full_url = home_url(add_query_arg(array(), $wp->request)); // 仅获取包含/sub-company/前缀的路径部分 $current_path = home_url($wp->request);
比如用户访问http://company.com/sub-company/about,$current_path会返回http://company.com/sub-company/about,完全符合你的需求。
额外注意事项
- 确认你已经在WP Engine控制面板中添加了
company.com作为站点的自定义域名,且配置无误 - 测试前可以先输出
var_dump($_SERVER)查看HTTP_X_FORWARDED_URI和HTTP_X_FORWARDED_HOST是否存在,确保代理服务器正确传递了这些头信息 - 如果是多站点网络,还要检查网络设置里的「站点域名」和「路径」配置是否正确
内容的提问来源于stack exchange,提问作者user433351

