2009-08-05 8 views
5

¿Existe alguna forma de que funcione para que cualquiera que pulse F5 o cualquier botón de actualización se mueva a una página diferente, en lugar de actualizar la página que el usuario desea?Impide que las personas refresquen la página

Algo así como:

If (refresh){ 

    goto "link to hopme page" 

} 

Si no hay alguna forma para que yo no permito refrescante en una determinada página?

Tengo algunas personas que están simplemente refrescándose sin parar y está matando mi ancho de banda. Es un sitio de juegos, por lo que no quiero prohibir la ip.

+0

¿Por qué? ¿Estás tratando de luchar contra el reenvío de variables POST? Usa AJAX. –

+0

¿Quiere decir cuando las personas actualizan la página o SÓLO cuando actualizan la página presionando F5? Clarifique – colithium

+2

¿Por qué le gustaría hacer esto? – Randell

Respuesta

8
session_start(); 
if($_SESSION['hasbeenhere'] == 1) 
{ 
// Page refreshed 
} 
else 
{ 
    $_SESSION['hasbeenhere'] = 1; 
} 

Si la persona no tiene las cookies habilitadas, esto no funcionará. Si alguien va a otra página y regresa, se mostrará como actualizada.

En general, no se puede hacer de una manera segura, pero esta es una forma de evitar que alguien vea la misma página dos veces.

Debido a su comentario, si desea evitar que las personas presionen F5 200 veces, intente esto.

$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. 
} 
+0

Bueno, si van a una página diferente y vuelven a esta página, ¿aumentará el conteo? ¿o es solo para refrescarse? ya que no me importa que vayan a una página diferente y luego vuelvan –

+0

Esto solo funciona para la página actual, permítanme modificarlo –

+0

Allí, intenten eso. Puede necesitar una pequeña modificación, pero todos los elementos básicos están ahí. –

3

¿Por qué le gustaría?

Pero no, no hay manera de que funcione de manera consistente que pueda detener esto.

+0

Tengo algunas personas que están presionando el botón F5 sin parar y está matando mi ancho de banda –

+1

Luego prohíbe esas direcciones IP –

+0

Hay muchas y quiero la mayoría de ellas para sitios de juegos. –

1

No tengo idea de si esto funcionaría, pero ¿podría escuchar las pulsaciones de teclas con javascript y, con la tecla F5, hacer lo que quiera?

0

Creo que se puede hacer esto:

session_start(); 

if (isset($_SESSION['visited'])) { 
    header("Location: http://the.page/you/want"); 
} else { 
    $_SESSION['visited'] = true; 
} 
0

el fin de detener F5 refrescante, que tendría de no permitir refrescante de cualquier tipo. Como hack, podrías intentar poner una marca de tiempo en la cadena de consulta. En la carga, puede verificar el valor de la marca de tiempo y, si está en el pasado, redirigir a otra página. Esto funcionaría si las cookies están deshabilitadas.

+0

** @ sideproject: ** Dado que el tiempo de creación del enlace siempre será anterior al momento en que se hace clic en el enlace, esto no funcionará. –

+0

De acuerdo. Lo mejor es ir con otra solución. – sideproject

0

El sitio en sí lo hace con Javascript, por lo que cuando está editando algo, no lo pierde refrescándolo, retrocediendo, etc. Probablemente hay algún evento definido por JQuery que le permite hacer esto, así que mire eso, y en ese caso, redirija a la página que desea (probablemente tiene que estar dentro del mismo dominio).

12

Quizás debería enfocar su esfuerzo en reducir el ancho de banda que su página está usando. Explore las áreas de compresión de imágenes, optimización de páginas y almacenamiento en caché.

+0

Estoy trabajando en eso también, pero necesito una solución por ahora. –

+2

Buena llamada. Si su servidor está utilizando servidores Apache, es muy probable que tenga 'mod_deflate' y' mod_gzip' a su disposición. Configurados correctamente, estos comprimirán el contenido de texto (como HTML, Javascript, CSS). Si está utilizando PHP, tal vez eche un vistazo a 'ob_start (" ob_gzhandler ");'. – Gav

3

En su código PHP, haga lo siguiente:

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(); 

favor caso omiso de mi mala muerte pseudo-PHP, no es mi lenguaje cotidiano.

Esto evitará que una página actualice (F5) y el usuario vuelva a hacer clic en el marcador o presione Intro en la barra de direcciones nuevamente.

También podría permitir a algunas etiquetas meta almacenamiento en caché agresivos y cabeceras HTTP, lo que evitará algunas actualizaciones de su servidor cada vez que golpea, pero el código anterior debe ser muy escalable.

Otra cosa a tener en cuenta: el problema de raíz es su otro código, no sus usuarios. Considere reescribir su página para que actualice automáticamente la parte que desea ver a través de AJAX en un retraso programado. Esto les dará incentivos para no usar Refresh, y ayudará a su servidor a sobrellevar solo teniendo que actualizar los pequeños datos que desean ver actualizados.

0

Me parece que no hay una buena solución técnica para este problema (las demás respuestas lo cubrieron bastante bien). Si los usuarios presionan constantemente actualizar en esta página, supongo que es porque esperan que la página cambie y quieren información actualizada. Tal vez debería quitarles la razón por la que desean actualizar la página. La forma más fácil de hacer esto sería hacer que la página se actualice solo (probablemente a través de AJAX). De este modo, el usuario puede sentarse allí y las actualizaciones simplemente llegarán, no más martilleo F5, lo que reducirá el ancho de banda, sin mencionar una mejor experiencia de usuario.

0

No está respondiendo su pregunta directamente, pero probablemente pueda resolver su problema con el almacenamiento en caché, ¿no es así?

Si envía una cabecera Cache-Control:, max-age pública = 120 Eso debería dar instrucciones al navegador que no es necesario para solicitar la página de nuevo durante 2 minutos y simplemente puede utilizar la copia de su caché . Si por supuesto pueden usar control-f5 para forzar una actualización pero debería ayudar mucho?

0

Acabo de encontrar una solución muy simple.

Para mí después de procesar toda la información $ _POST y salvar a los que necesito en una var $ _SESSION hago esto:

$_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"); 
} 

En mi caso yo estaba tratando de validar el usuario, y tengo el problema es que cuando alguien cierra sesión y regresa y actualiza la carga del sitio otra vez, y con esto simple si finalmente lo resolvió.

PD:. "? P = redirected" es solo para la prueba porpouse

Cuestiones relacionadas