2010-05-18 13 views
5

Inicio de sesión en un sitio Estoy trabajando en las funciones que esperaba en mi máquina local pero falla en el servidor remoto pero SOLAMENTE en Internet Explorer. El truco es que funciona en IE localmente, pero no en la máquina remota.Las variables de sesión no se configuran, pero solo en Internet Explorer y no en todas las máquinas

¿Qué demonios podría causar esto? He recorrido el código en la máquina remota y puedo ver los valores de inicio de sesión ingresados ​​que se verifican en la base de datos, se encuentran y luego se llama a una función de inicio de sesión. Esto establece dos variables $ _SESSION y redirecciones a la página principal de administración. Sin embargo, en IE solamente (y no cuando se ejecuta en la máquina local ... esta es la clave) las variables $ _SESSION no están presentes cuando se llega a la página principal de administración. var_dump($_SESSION) me da lo que espero en cada navegador cuando estoy ejecutando esto en mi entorno local y en todos los navegadores excepto IE 6, 7 y 8 cuando se ejecutan en el servidor remoto (donde obtengo un valor nulo como si nada hubiera sido establecido para $ _SESIÓN).

Esto realmente me tiene perplejo por lo que cualquier consejo es apreciado.

Por ejemplo ... en IE, ejecutar localmente, var_dump me da:

array 
'Username' => string 'theusername' length=11 
'UserID' => string 'somevalue' length=9 

Ejecutar en el servidor remoto (IE sólo ... funciona bien en otros navegadores) var_dump me da:

array(0){} 

de código (un ejemplo mínimo ... aunque realmente un ejemplo de código no se necesita con este tema):

$User = GetUser($Username, $Password); 
    if ($User->UserID <> "") { // this works so we call Login()... 
     Login($User); // this also works and gives expected results. on to redirect... 
     header("Location: index.php"); // a var_dump at index.php shows that there is no session data at all in IE, remotely. 
    } else { 
     header("Location: login.php"); 
    } 


function Login($data) { 
     $_SESSION['Username'] = $data->Username; 
     $_SESSION['UserID'] = $data->UserID; 
// a var dump here gives the expected data in every browser 
    } 

EDITAR: Ha resuelto esto. Fue el hecho de que el nombre de dominio en el servidor de prueba tenía un guión bajo. No tengo idea de por qué y no tengo tiempo para buscarlo ahora, pero el guión bajo, llamado algo así como un_cliente.empresa.com, fue el problema. Me encanta Internet Explorer ... es como un compañero de trabajo pasivo y agresivo que simplemente no puedes evitar.

+0

¿Muestra de código para que podamos ver? –

+0

¿Incluyó 'session_start();' en la parte superior de cada página? – Alec

+0

¿Incluyó session_start(); en la parte superior de cada página? Sí. – Stuart

Respuesta

2

Poniendo esto como una respuesta (sugerida por el usuario tuzo) para que sea más fácil de encontrar. Resuelto esto Fue el hecho de que el nombre de dominio en el servidor de prueba tenía un guión bajo.No tengo idea de por qué y no tengo tiempo para buscarlo ahora, pero el guión bajo, llamado algo así como un_cliente.empresa.com, fue el problema. Me encanta Internet Explorer ... es como un compañero de trabajo pasivo y agresivo que simplemente no puedes evitar.

Tomado de otra respuesta SO ... explica exactamente lo que está pasando: ¿Alguno de los subdominios usa un guión bajo? IE tiene problemas para aceptar cookies de los subdominios que no siguen el URI RFC. (http://www.ietf.org/rfc/rfc2396.txt)

0

Intenta poner session_start(); . En la parte superior de la página que está haciendo las sesiones en y comprobar si asigna la sesión vars de la manera correcta:

$_SESSION['SESSION_NAME'] = 'sessionValue'; 
+1

¿Qué hay de malo con el modo OP? Además, si funciona en todos los navegadores pero IE (s) obviamente incluye 'session_start()' en cada página ... –

1

Comprobar el valor de session.cookie_domain en su archivo php.ini. Si ese valor está establecido, asegúrese de que sea lo que espera. Esa es la cosa más grande que puedo pensar que podría comportarse de forma diferente localmente a distancia.

Además, si tiene un valor establecido en session.cookie_lifetime, intente comentar esa línea en su php.ini. Vi un comportamiento peculiar con IE cuando solté un valor allí.

Aquí hay un comprobador de sesión rápido. Si vuelves a cargar la página y sigues viendo nuevos valores para el token, no obtendrás una sesión persistente. Entonces definitivamente puedes culpar a la configuración del servidor/PHP y no a tu código.

<?php 
session_start(); 
if (!isset($_SESSION['token'])) { 
    $_SESSION['token'] = sha1(uniqid(rand(), true)); 
} 

if (!empty($_POST)) { 
    $_SESSION['hi'] = preg_replace('/[^\w ]+/','',$_POST['hi']); 
    header("Location: index.php"); 
    exit; 
} 

?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<title>Session test</title> 
</head> 
<body> 

<h1>How's that session doing?</h1> 
<p>Message: <?=htmlspecialchars($_SESSION['hi'])?></p> 
<p>Token: <?=htmlspecialchars($_SESSION['token'])?></p> 


<form action="index.php" method="post"> 
<fieldset> 
    <label for="hi">What do you have to say?</label> 
    <input type="text" name="hi" id="hi"> 
    <input type="submit" value="Submit"> 
</fieldset> 
</form> 

</body> 
</html> 
1

"fue el hecho de que el nombre de dominio en el servidor de prueba tenía un guión en él" Esto es absolutamente cierto. Esta publicación se encontró después de pasar más de 3 horas para resolver el mismo problema. Muchas gracias a gaoshan88

0

Hemos tenido el mismo problema, sin embargo, no fueron los caracteres del nombre del servidor, sino el tiempo del servidor los que no estaban correctos. Esto causó que nuestras cookies de sesión no fueran válidas al instante en IE mientras funcionaba en otros navegadores.

Cuestiones relacionadas