2016-01-02 5 views
4

Я создаю простой инструмент, который отслеживает и увеличивает количество посещений веб-сайта. Это что-то просто, как:Обнаруживать предварительную выборку страницы Google Chrome

Когда сервер получает запрос GET, это увеличит счетчик в базе данных для этого сайта 1.

Однако, я бегу к битном проблемы с Google Chrome, механизм предварительного рендеринга («Предсказывать сетевые действия для повышения производительности загрузки страницы»).

Веб-сайт www.domain.com, и как только вы вводите имя домена www.domain.com в адресную строку браузера (без нажатия клавиши Enter), Chrome отправляет запрос GET для предварительной выборки страницы, в результате чего регистрацию сервера, которая посещает и увеличивает счетчик в базе данных на 1. После этого, если пользователь нажимает Enter и фактически загружает веб-страницу, сервер увидит еще один запрос GET, увеличивая счетчик. Это приводит к 2 повторным посещениям, зарегистрированным в базе данных. Насколько я понимаю, Google Chrome загружает только страницу, но не выполняет ее, но как только мой сервер получает запросы GET, счетчик увеличивается.

Вопрос: Есть ли способ обойти это? Предпочтительно, я хотел бы определить, является ли это предварительной выборкой или фактическим пользователем, который посещает веб-сайт.

+0

Есть несколько вопросов на SO и других сайтах SE, в которых говорится, что раньше был заголовок, но его больше нет, и что нет способа определить, вызвана ли GET предварительной выборкой или нет, сторона JS после загрузки страницы. –

ответ

2

Похоже, что это необнаруживаемая сторона сервера.

Для проекта Chromium была открыта проблема. Он обозначен как «не исправит» (Prerendering does not have any distinguishing HTTP headers). Запрос предварительной выборки не отображается на вкладке «Инструменты» Dev Tools, поэтому вы не можете легко подтвердить это, просмотрев заголовки. Я проверил их, используя Wireshark, и, к сожалению, не было различий, отличающих запросы предварительного рендеринга от «нормальных» запросов.

Обход:

Вы можете проверить на упреждающую выборку страниц на стороне клиента с помощью Page Visibility API. Это немного больше, чем отслеживание на стороне сервера, но вы можете вставить тег сценария на свою страницу, который проверяет, является ли это запросом prerender. Если это так, отправьте запрос AJAX, который каким-то образом идентифицирует, на какой странице он был, и используйте это, чтобы увеличить счетчик в своей базе данных.

if (document.visibilityState !== 'prerender') 
{ 
    //ajax call registering page hit 
} 

Просто следите за тем, чтобы запрос AJAX не возвращал результат из кеша, не позволяя ему прибыть на сервер.

+0

Привет! Спасибо за ответ. На данный момент я считаю, что лучшим способом является обнаружение загрузки страницы с помощью javascript, а затем увеличение счетчика только тогда, когда сценарий фактически выполняется (что не работает механизм prerender Chrome). – cuzmAZN

+0

Двигатель prerender Chrome может выполнять скрипты. Я смог отправить AJAX-вызов на сервер с предварительно отрисованной страницы. Вот почему я предложил проверить visibilityState. То, что он, вероятно, не делает, это загрузить внешние скрипты и выполнить их. Я тестировал с помощью встроенного скрипта. – Brian

 Смежные вопросы

  • Нет связанных вопросов^_^