我需要在 HTTP_REFERER URL 之前获取 URL,例如在他到达最后一页之前访问的 URL,当单击按钮时,我从 Observer 中获取 HTTP_REFERER。
问题是:如何在 HTTP_REFERER 之前获取以前的 URL?
谢谢 ;)
你是说像这个?one_back
是上一页。two_back
是前两个referer页面。
<?php
session_start();
if ($_SERVER['HTTP_REFERER'])
{
$_SESSION['two_back'] = $_SESSION['one_back'] ?: NULL;
$_SESSION['one_back'] = $_SERVER['HTTP_REFERER']?: NULL;
}
?>
没有真正的方法可以这样做。$_SERVER['HTTP_REFERER']
甚至只有当您从其他地方(在这种情况下为引用者)链接时才可用。不是当您自己输入 URL 时。
一种让您在当前页面之前获得 2 页的方法是当您有一种用户跟踪形式并将其保存在数据库中时。
例如,每次用户访问时,您都会在数据库中插入一行,其中包含用户的位置、IP 和当前日期时间。
代码示例:
$db = null;
// Try to make a database connection
try
{
$db = new PDO('mysql:host=localhost;dbname=mydatabase', 'user', 'password');
}
// In case of failed connection,
// catch the error so it won't give away your information.
catch(PDOException $e)
{
die("Connection failed");
}
// Prepare the statement
$trackUser = $db->prepare("INSERT INTO `mytable`(`IP`, `URL`, `Date`) VALUES(:ip, :url, :date)");
// Set the datetime in yyyy-mm-dd hh:mm:ss
$datetime = strftime("%F %T");
// Bind everything
$trackUser->bindParam(":ip", $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR);
$trackUser->bindParam(":url", $_SERVER['REQUEST_URI'], PDO::PARAM_STR);
$trackUser->bindParam(":date", $datetime, PDO::PARAM_STR);
$trackUser->execute();
但是直接从用户那里获取呢?你不能那样做。
从手册
将用户代理引向当前页面的页面地址(如果有)。这是由用户代理设置的。不是所有的用户代理都会设置这个,有些提供修改 HTTP_REFERER 作为一个特性的能力。简而言之,它不能真正被信任。
我这样做的方式是使用 nginx 将 uri 存储为获取字符串
error_page 404 $scheme://$host/404.php?referer=$request_uri;
所以website.com/not-found
会去website.com/404.php?uri=/not-found
显然这是一个测试用例,但如果你知道有一些类似的问题,那么你可以走这条路。