问题描述
我正在尝试将 HTTP_REFERER 保存到 $_SESSION[] 变量,并且仅在引用页面与当前页面不匹配时才更新它。这样,如果我通过 PHP 脚本重新加载页面,它不会将我所在的当前页面保存为引用者。
首先,我获取 REFERER 并将其与当前 URL 进行比较:
$referer = $_SERVER["HTTP_REFERER"];
preg_match('/^(.*?\:\/\/)/',$referer,$start);
$url = $start[0].$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if($url != $referer){
$_SESSION['referer'] = $_SERVER["HTTP_REFERER"];
}
然后我检查输出:
echo $_SESSION['referer'];
问题在于它无论如何都会更新会话!
我尝试用 cookie 而不是会话变量来做同样的事情。使用 cookie,我可以在控制台中看到它的变化。它不会更新,然后一秒钟后它会更新。几乎就像页面加载了两次一样。
当我设置此代码时
setcookie('test',$_SERVER["HTTP_REFERER"]);
当我进入一个新页面时,它会正确显示正确的引用,然后在一秒钟后切换到当前页面。
我当前的设置使用 .htaccess,这样我就不必键入页面的文件名。我有任何子文件夹的所有请求都转到 /index.PHP
所以http://example.com/home或http://example.com/coolpage都会回到http://example.com/index.php
然后使用 PHP 查找与该子文件夹同名的文件,然后将其作为一种简单的模板系统“包含”在我的 index.PHP 文件中。
这些 .htaccess 重定向是否与 $_SERVER["HTTP_REFERER"] 混淆?如果我直接在我的代码中使用 $_SERVER["HTTP_REFERER"] 它工作正常(它没有更新)。只有当我尝试将它保存到另一个变量时,事情才会变得不稳定。
是否有更好的方法让后退按钮将用户发送回他们原来的位置,而无需考虑同一 URI 的多个页面加载?
解决方法
我发现了一个看起来有点奇怪的解决方法,但它达到了我想要的效果。
我将整个事情包装在一个 if 语句中,仅当 $uri != favicon.ico 时才执行
if($uri != 'favicon.ico'){
$referer = $_SERVER["HTTP_REFERER"];
preg_match('/^(.*?\:\/\/)/',$referer,$start);
$url = $start[0].$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if($url != $referer){
$_SESSION['referer'] = $_SERVER["HTTP_REFERER"];
}
$backButton = $_SESSION['referer'];
}