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

如何用PHP获取当前URL?及AJAX调用时的URL异常问题

Hey,我来帮你搞定这两个PHP URL相关的问题~

一、如何用PHP获取当前URL?

常规场景下(直接访问PHP页面时),你可以用下面的代码兼容HTTP和HTTPS协议,准确获取当前页面的完整URL:

// 判断当前协议是HTTP还是HTTPS
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
// 拼接完整URL
$currentUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

echo $currentUrl;

比起你之前硬写https://的方式,这段代码会自动根据当前服务器的协议适配,避免在HTTP环境下输出错误的HTTPS地址。

二、AJAX请求时获取前端页面URL的解决方案

你遇到的问题很典型:当用fetch/XHR发起AJAX请求时,PHP里的$_SERVER变量记录的是后端PHP文件自身的请求信息,而非发起请求的前端页面URL。要拿到前端页面的URL,有两种简单可靠的方法:

方法1:通过自定义请求头传递

前端发起请求时,把当前页面的URL放在自定义请求头里传给后端:

前端代码修改:

const item = document.querySelector('.item');
// 获取当前前端页面的完整URL
const currentPageUrl = window.location.href;

fetch('path/wp-content/themes/current_theme_directory/called.php', {
  headers: {
    // 自定义请求头,命名建议以X-开头(传统规范)
    'X-Frontend-Page-Url': currentPageUrl
  }
})
.then(res => res.text())
.then(responseText => item.innerHTML = responseText);

后端called.php代码:

// 检查自定义请求头是否存在
if (isset($_SERVER['HTTP_X_FRONTEND_PAGE_URL'])) {
  // 拿到前端页面URL
  $frontendUrl = $_SERVER['HTTP_X_FRONTEND_PAGE_URL'];
  echo $frontendUrl;
} else {
  // 非AJAX请求时,用常规方法获取当前URL
  $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $currentUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  echo $currentUrl;
}

注意:大部分服务器默认允许读取自定义请求头,如果遇到获取不到的情况,可以检查Nginx/Apache的配置,确保没有拦截这类请求头。

方法2:通过GET参数传递

如果觉得请求头的方式麻烦,也可以直接把前端URL作为GET参数拼在请求地址里:

前端代码:

const item = document.querySelector('.item');
// 编码URL,避免特殊字符导致参数解析错误
const encodedPageUrl = encodeURIComponent(window.location.href);

fetch(`path/wp-content/themes/current_theme_directory/called.php?frontendUrl=${encodedPageUrl}`)
.then(res => res.text())
.then(responseText => item.innerHTML = responseText);

后端called.php代码:

if (isset($_GET['frontendUrl'])) {
  // 解码拿到原始URL
  $frontendUrl = urldecode($_GET['frontendUrl']);
  echo $frontendUrl;
} else {
  // 非AJAX请求的 fallback 逻辑
  $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $currentUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  echo $currentUrl;
}

这种方法更直观,也不用担心请求头被拦截的问题,只要记得用encodeURIComponent编码URL就行。

针对WordPress的额外小提示

如果你是在WordPress主题里开发,其实可以用WordPress自带的AJAX机制(通过admin-ajax.php),这样能更规范地处理请求,还能避免硬编码主题路径的问题。不过如果你的需求只是简单获取前端URL,上面两种方法已经完全够用啦。

内容的提问来源于stack exchange,提问作者Galgóczi Levente

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:24:26