Определить, обновлен ли браузер или нет, используя PHP

Я хочу определить, обновляется ли браузер или нет с помощью PHP, и если браузер обновляется, какой именно код PHP должен выполняться.

Если вы хотите, чтобы этот запрос с побочными эффектами (как правило, POST-запросы) можно было отправлять несколько раз, вы должны указать это в своем вопросе. Потому что здесь будет использоваться другой подход, нежели ответы, использованные до сих пор.

Gumbo 19.01.2009 18:34

Согласился с Гамбо. Если на самом деле ваша цель - избежать побочных эффектов от запросов POST, вам, вероятно, следует перенаправить с помощью GET на новую страницу.

Wickethewok 19.01.2009 20:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
2
17 036
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Если вы имеете в виду, что хотите различать, когда пользователь впервые заходит на страницу, и когда он перезагружает страницу, проверьте реферер. На php это: $ _SERVER ["HTTP_REFERER"]. Посмотрите, совпадает ли оно со страницей, на которой работает ваш скрипт. Может случиться так, что клиент не предоставляет эту информацию, в этом случае вы можете установить cookie или переменную сеанса, чтобы отслеживать, какая страница была последней запрошенной.

<?php

    session_start();
    if (!isset($_SESSION["visits"]))
        $_SESSION["visits"] = 0;
    $_SESSION["visits"] = $_SESSION["visits"] + 1;

    if ($_SESSION["visits"] > 1)
    {
        echo "You hit the refresh button!";
    }
    else
    {
        echo "This is my site";
    }

    // To clear out the visits session var:
    // unset($_SESSION["visits"]);

?>

Это, конечно, не гарантирует, что они нажмут кнопку обновления. Они могли вернуться на эту страницу, например, по одной из внутренних ссылок вашего сайта.

Wickethewok 19.01.2009 20:37

Голосование против. Это позволит обнаружить только несколько посещений сайта. Каждая перезагрузка или переход к другому URL-адресу, имеющему этот скрипт, будет увеличивать счетчик. Это бесполезно для определения перезагрузки страницы.

six8 28.08.2012 09:42
Ответ принят как подходящий

Если страница была обновлена, можно ожидать, что два следующих друг за другом запроса будут для одного и того же URL-адреса (путь, имя файла, строка запроса) и одного и того же содержимого формы (если есть) (данные POST). Это может быть довольно много данных, поэтому лучше всего их хешировать. Так ...


<?php
session_start();

//The second parameter on print_r returns the result to a variable rather than displaying it
$RequestSignature = md5($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].print_r($_POST, true));

if ($_SESSION['LastRequest'] == $RequestSignature)
{
  echo 'This is a refresh.';
}
else
{
  echo 'This is a new request.';
  $_SESSION['LastRequest'] = $RequestSignature;
}

В ситуации AJAX вам нужно быть осторожным с тем, в какие файлы вы помещаете этот код, чтобы не обновлять подпись LastRequest для скриптов, которые были вызваны асинхронно.

@naveen, что, если у пользователя открыто несколько вкладок на вашем веб-сайте, он отправляет форму на первой вкладке, отправляет что-то еще на другую вкладку, закрывает эту вкладку, а затем нажимает кнопку «Обновить» на первой вкладке? последний запрос может не всегда работать.

dqhendricks 23.01.2012 21:19

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

session_start();

$pageRefreshed = false;
if (isset($_SESSION['LAST_REQUEST']) && $_SERVER['REQUEST_URI'] === $_SESSION['LAST_REQUEST']['REQUEST_URI']) {
    if (isset($_SERVER['HTTP_REFERER'])) {
         // check if the last request’s referrer is the same as the current
         $pageRefreshed = $_SERVER['HTTP_REFERER'] === $_SESSION['LAST_REQUEST']['HTTP_REFERER'];
    } else {
         // check if the last request didn’t have a referrer either
         $pageRefreshed = $_SERVER['HTTP_REFERER'] === null;
    }
}

// set current request as "last request"

$_SERVER['LAST_REQUEST'] = array(
    'REQUEST_URI'  => $_SERVER['REQUEST_URI'],
    'HTTP_REFERER' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null
);

Я не тестировал, но должно работать.

Чтобы предотвратить дублирование обработки формы, когда пользователь нажимает кнопку обновления или возврата в браузере, необходимо использовать переменную сеанса идентификатора экземпляра страницы и ввод скрытой формы, содержащий эту переменную. если они не совпадают, значит, пользователь обновил страницу, и вам не следует повторно обрабатывать форму. для получения дополнительной информации см .:

https://www.spotlesswebdesign.com/blog.php?id=11

другой метод - отправить запросы формы на полностью отдельную страницу, а затем использовать заголовок для перенаправления серверной части обратно на исходную страницу после обработки запроса. Таким образом, кнопки «Назад» и «Обновить» ни на что не повлияют, поскольку страница обработки формы никогда не загружается на стороне клиента.

dqhendricks 23.01.2012 21:21

Когда пользователь нажимает кнопку обновления, браузер включает дополнительный заголовок, который появляется в массиве $ _SERVER.

Проверьте кнопку обновления, используя следующее:

    $refreshButtonPressed = isset($_SERVER['HTTP_CACHE_CONTROL']) && 
                            $_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';

в PHP> = 5.2.0 можно использовать filter_input(INPUT_SERVER, 'HTTP_CACHE_CONTROL') === 'max-age=0' для ясного кода

Pedro Sanção 10.02.2015 16:30

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