Запросите URI, возвращающий два URL в массив $_SESSION

Я провел последние 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

1 ответ

Как вы наблюдаете разные значения $_SERVER['REQUEST_URI'] переменная почти наверняка, что каждый раз, когда вы просматриваете конкретную страницу, отправляется другой запрос на получение страницы предыдущего поста. Это может происходить по разным причинам, таким как скрипты и фреймы на вашей странице. Однако из того, что вы описываете, вполне вероятно, что предварительная выборка ссылок является причиной того, что вы наблюдаете.

Вы можете легко проверить это, отключив предварительную выборку ссылок в вашем браузере ( см. Здесь, например, Firefox).

Ты можешь иметь <link rel='prev' ..., <link rel='next' ... и / или <link rel='prefetch' ... теги в источнике вашего сайта, которые побуждают браузер предварительно выбирать определенные страницы. Однако их удаление не означает, что браузер не будет пытаться что-либо предварительно выбрать.

Невозможно надежно проверить, является ли запрос запросом предварительной выборки исключительно на стороне сервера. Некоторые браузеры отправляют дополнительный заголовок HTTP-запроса при загрузке предварительной выборки, но вы не можете на это полагаться.

Одним из способов решения этой проблемы является встраивание в ваш веб-сайт javascript, который регистрирует каждый раз, когда страница отображается (например, выполняется скрипт) или просматривается (с использованием API видимости), отправляя асинхронный запрос некоторому сценарию на вашем сервере.

Вы можете найти дополнительную информацию в этом ответе и комментарии к нему.

Другие вопросы по тегам