请求URI返回两个url';s到$_SESSION数组


Request URI returning two url's to $_SESSION array

我花了8个小时试图破解这个。

我正在记录用户在$_SESSION数组(在wordpress上)中查看的URL

来自我的history.php,我在所有页面上都有:

session_start();
$currentpageurl= esc_url($_SERVER['REQUEST_URI']);
is_array($_SESSION["pageurl"]) or $_SESSION["pageurl"] = array();
$_SESSION['pageurl'][] = $currentpageurl;

然后我调用数组项来查看日志,如下所示:

foreach($_SESSION['pageurl'] as $key=>$value)
    {
    echo 'Page view '.$key.' was '."'".$value."'".' <br />';
    }

这一切都有效。但在结果中,我访问的帖子之前的帖子也会记录为"已访问页面"。我检查了所有文件中可能导致http请求的断开链接,所有内容都被检查出来了。我甚至把Request URI$_SERVER改成了其他东西,比如SCRIPT URI,而且之前的帖子总是加载。

如果我访问这些页面:

mysite.com/article-y
mysite.com/article-z

数组显示之前的页面(未访问):

mysite.com/article-y 
mysite.com/article-x <--not visited, but somehow in session array
mysite.com/article-z

当您观察到$_SERVER['REQUEST_URI']变量的不同值时,几乎可以肯定的是,每次查看特定页面时,都会发送另一个检索前一篇文章页面的请求。发生这种情况的原因可能多种多样,比如页面上的脚本和iframe。然而,从你的描述来看,链接预取很可能是你观察到的原因。

您可以通过在浏览器中禁用链接预取来轻松检查这一点(例如,请参阅此处的Firefox)。

您的网站源中可能有<link rel='prev' ...<link rel='next' ...和/或<link rel='prefetch' ...标签,这些标签鼓励浏览器预取特定页面。但是,删除这些并不意味着浏览器不会尝试预取任何内容。

仅在服务器端无法可靠地检查请求是否为预取请求。有些浏览器在加载预取时会发送额外的HTTP请求标头,但您不能依赖它。

解决这一问题的一种方法是在您的网站中嵌入一个javascript,通过向服务器上的某个脚本发送异步请求,每当页面被呈现(例如脚本被执行)或被查看(使用Visibility API)时,该javascript都会记录。

你可以在这个答案和评论中找到更多信息。