Я провел последние 8 часов, пытаясь взломать этот.
Я регистрирую URL, которые пользователи просматривают в массиве $ _SESSION (на 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
на другие вещи из $_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']
переменная почти наверняка, что каждый раз, когда вы просматриваете определенную страницу, отправляется другой запрос на получение страницы предыдущего поста. Это может происходить по разным причинам, таким как скрипты и фреймы на вашей странице. Однако из того, что вы описываете, кажется, что предварительная загрузка ссылок является причиной того, что вы наблюдаете.
Вы можете легко проверить это, отключив предварительную выборку ссылок в вашем браузере (смотрите здесь для Firefox например).
Ты можешь иметь <link rel='prev' ...
, <link rel='next' ...
и / или <link rel='prefetch' ...
теги в источнике вашего сайта, которые побуждают браузер предварительно выбирать определенные страницы. Однако их удаление не означает, что браузер не будет пытаться что-либо предварительно выбрать.
Невозможно надежно проверить, является ли запрос запросом предварительной выборки только на стороне сервера. Некоторые браузеры отправляют дополнительный заголовок HTTP-запроса при загрузке предварительной выборки, но вы не можете на это полагаться.
Одним из способов решения этой проблемы является встраивание в ваш веб-сайт javascript, который регистрирует каждый раз, когда страница отображается (например, выполняется скрипт) или просматривается (используя API видимости) отправив асинхронный запрос к какому-либо скрипту на вашем сервере.
Вы можете найти дополнительную информацию в этот ответ и комментарии к нему.
Других решений пока нет …