如何在test.php中获取跳转来源页面的完整URL?
可以实现!这里有几种可靠的方法帮你搞定
首先得说,你遇到的$_SERVER['HTTP_REFERER']失效问题太常见了——这个值完全依赖浏览器主动发送,很多场景下它都会丢失:比如浏览器开启隐私模式、用户直接通过书签/地址栏访问、HTTPS页面跳转到HTTP页面,甚至有些浏览器插件会主动屏蔽这个字段。所以靠它确实不稳定,得换更可靠的方式。
下面给你几个可行的方案,按需选择就行:
方案1:通过URL参数传递(最简单直接)
在「页面#1」的按钮链接里,直接把当前页面的完整URL作为参数传过去:
<!-- 页面#1的按钮代码 --> <a href="/test.php?from=<?php echo urlencode('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); ?>" class="button">跳转至test.php</a>
然后在test.php里,读取这个参数并输出:
// test.php代码 <?php if(isset($_GET['from'])){ // 用htmlspecialchars防止XSS攻击 echo '跳转来源:' . htmlspecialchars(urldecode($_GET['from'])); } else { echo '未检测到来源页面'; } ?>
这种方法的好处是简单,不需要依赖Session,缺点是来源URL会暴露在地址栏里。
方案2:用Session存储来源(适合不想暴露URL的场景)
如果不想在地址栏显示来源信息,可以用PHP的Session来存储:
首先在「页面#1」的顶部开启Session并保存当前URL:
<!-- 页面#1的顶部代码 --> <?php session_start(); // 保存完整的来源URL $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://'; $_SESSION['referrer_url'] = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>
然后按钮正常跳转:
<a href="/test.php" class="button">跳转至test.php</a>
最后在test.php里读取Session的值:
// test.php代码 <?php session_start(); if(isset($_SESSION['referrer_url'])){ echo '跳转来源:' . htmlspecialchars($_SESSION['referrer_url']); // 可选:用完后清除这个Session值,避免后续请求重复显示 unset($_SESSION['referrer_url']); } else { echo '未检测到来源页面'; } ?>
这种方法更隐蔽,但要确保用户浏览器支持Cookie(Session依赖Cookie)。
方案3:表单隐藏字段(如果按钮是表单提交的情况)
如果你的按钮是表单的提交按钮,可以在表单里加一个隐藏字段来传递来源URL:
<!-- 页面#1的表单代码 --> <form action="/test.php" method="post"> <?php $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://'; $fullUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?> <input type="hidden" name="from" value="<?php echo urlencode($fullUrl); ?>"> <button type="submit">提交并跳转</button> </form>
然后在test.php里读取POST参数:
// test.php代码 <?php if(isset($_POST['from'])){ echo '跳转来源:' . htmlspecialchars(urldecode($_POST['from'])); } else { echo '未检测到来源页面'; } ?>
关键注意事项
- 不管用哪种方法,输出的时候一定要用
htmlspecialchars()处理,防止XSS攻击,避免恶意代码注入。 - 代码里的
$protocol判断可以自动适配HTTP/HTTPS环境,避免硬写协议导致的错误。
内容的提问来源于stack exchange,提问作者Kaspar
相关产品推荐
相关产品推荐

