如何用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
相关产品推荐
相关产品推荐

