Не дать людям обновить страницу - PullRequest
5 голосов
/ 05 августа 2009

Можно ли как-нибудь заставить его работать так, чтобы любой, кто нажмет F5 или любую кнопку обновления, будет перемещен на другую страницу вместо обновления страницы, которую хочет пользователь?

Что-то вроде:

If (refresh){

  goto "link to hopme page"

}

Если нет, то как я могу запретить обновление на определенной странице?

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

Ответы [ 11 ]

12 голосов
/ 05 августа 2009

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

8 голосов
/ 05 августа 2009
session_start();
if($_SESSION['hasbeenhere'] == 1)
{
 // Page refreshed
}
else
{
   $_SESSION['hasbeenhere'] = 1;
}

Если у человека не включены файлы cookie, это не удастся. Если кто-то переходит на другую страницу и возвращается, он будет показан как обновленный.

В целом, вы не можете сделать это безошибочно, но это один из способов, чтобы кто-то не видел одну и ту же страницу дважды.

Из-за вашего комментария, если вы хотите, чтобы люди не нажимали F5 200 раз, попробуйте это.

$page = $_SERVER['REQUEST_URI'];
// Defaults
if(!isset($_SESSION[$page]['count']))
{
    $_SESSION[$page]['count'] = 1;
    $_SESSION[$page]['first_hit'] = time();
    $_SESSION[$page]['banned'] = false;
}
else
{
    $_SESSION[$page]['count']++; // Increase the counter
}

// If person is banned, end script
if($_SESSION[$page]['banned'] == true)
{
    die();
}

if($_SESSION[$page]['first_hit'] < time() - 30)
{
    $_SESSION[$page]['count'] = 1; // Reset every 30 seconds
}

if($_SESSION[$page]['count'] > 100)
{
    $_SESSION[$page]['banned'] = true; 
    // Ban if they hit over 100 times in 30 seconds.
}
3 голосов
/ 05 августа 2009

В вашем PHP-коде сделайте следующее:

 if(isset($_SESSION["pagename-LAST_VIEWED"])) {
    v = $_SESSION["pagename-LAST_VIEWED"])
    if(time() - v < 15) {
       // user is refreshing more than once per 15 seconds
       // send them something else and die
       }
 }
 $_SESSION["pagename-LAST_VIEWED"] = time();

Пожалуйста, не обращайте внимания на мой отвратительный псевдо-PHP, это не мой повседневный язык.

Это предотвратит как обновление страницы (F5) , так и , когда пользователь просто снова щелкнет закладку или снова нажмет Enter в адресной строке.

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

Еще одна вещь, которую стоит учесть: корень проблемы в другом коде, а не в ваших пользователях. Попробуйте переписать свою страницу, чтобы она автоматически обновляла ту часть, которую они хотят видеть через AJAX, с временной задержкой. Это даст им стимул не использовать Refresh и поможет вашему серверу справиться с ситуацией, только обновив небольшой кусочек данных, которые они хотят видеть обновленными.

3 голосов
/ 05 августа 2009

Зачем вам это нужно?

Но нет, нет способа, который будет работать последовательно, чтобы остановить это.

1 голос
/ 05 августа 2009

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

0 голосов
/ 22 декабря 2013

Я только что нашел очень простое решение.

После обработки всей информации $ _POST и сохранения нужных мне данных в переменную $ _SESSION я делаю это:

$_SESSION['admin']['PID']=session_id();
$_SESSION['admin']['user_user']=$_POST['user'];
$_SESSION['admin']['user_pass']=$_POST['pass'];
$_SESSION['admin']['last_access_time']=time();
if($_SERVER['REQUEST_METHOD']==="POST")
{
    header("LOCATION:".$_SERVER['PHP_SELF']."?p=redirected");
}

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

PD:. "? P = redirected" только для тестирования porpouse

0 голосов
/ 05 августа 2009

Он не отвечает на ваш вопрос напрямую, но вы, вероятно, можете решить свою проблему с помощью кэширования, не так ли?

Если вы отправляете заголовок Cache-Control: общедоступный, max-age = 120 Это должно указать браузеру, что ему не нужно запрашивать страницу снова в течение 2 минут, и он может просто использовать копию из своего кэша. Если, конечно, они могут использовать control-f5 для принудительного обновления, но это должно сильно помочь?

0 голосов
/ 05 августа 2009

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

0 голосов
/ 05 августа 2009

Сам сайт делает это с помощью Javascript, поэтому, когда вы редактируете что-то, вы не теряете его, обновляя, возвращаясь и т.д. и в этом случае перенаправьте на нужную страницу (вероятно, в том же домене).

0 голосов
/ 05 августа 2009

Чтобы запретить обновление F5, вам не нужно разрешать обновление любого типа. В качестве хака вы можете попытаться вставить метку времени в строку запроса. При загрузке вы можете проверить значение метки времени и, если оно прошло, перенаправить на другую страницу. Это будет работать, если куки отключены.

...