0

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

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

来自我在所有页面上包含的 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为其他内容。$_SERVERSCRIPT 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
4

1 回答 1

1

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

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

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

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

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

您可以在此答案及其评论中找到更多信息。

于 2015-03-23T14:02:46.737 回答