2010-05-18 6 views
5

La connexion à un site sur lequel je travaille fonctionne normalement sur ma machine locale mais échoue sur le serveur distant, mais SEULEMENT dans Internet Explorer. Le kicker est que cela fonctionne dans IE localement, mais pas sur la machine distante.Les variables de session ne sont pas définies mais uniquement dans Internet Explorer et pas sur toutes les machines

Qu'est-ce que dans le monde pourrait causer cela? J'ai parcouru le code sur la machine distante et peut voir les valeurs de connexion entrées étant vérifiées dans la base de données, ils sont trouvés, puis une fonction de connexion est appelée. Cela définit deux variables $ _SESSION et redirige vers la page d'administration principale. Cependant, dans IE seulement (et non lorsqu'il est exécuté sur la machine locale ... c'est la clé) les variables $ _SESSION ne sont pas présentes au moment où vous arrivez à la page d'administration principale. var_dump($_SESSION) me donne ce que j'attends sur tous les navigateurs quand j'utilise ceci dans mon environnement local et dans tous les navigateurs sauf IE 6, 7 et 8 lorsqu'ils sont exécutés sur le serveur distant (où j'obtiens une valeur nulle comme si rien n'a été _SESSION).

Cela m'a vraiment perplexe donc tout conseil est apprécié.

Pour un exemple ... dans IE, exécutez localement, var_dump me donne:

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

Exécuter sur le serveur distant (IE uniquement ... fonctionne très bien dans d'autres navigateurs) var_dump me donne:

array(0){} 

code (un exemple minimal ... mais vraiment un exemple de code n'est pas nécessaire avec ce numéro):

$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 
    } 

ÉDIT: Résolu ceci. C'était le fait que le nom de domaine sur le serveur de test avait un trait de soulignement. Aucune idée pourquoi et ne pas avoir le temps de Google pour le moment, mais le trait de soulignement, nommé quelque chose comme some_client.ourcompany.com, était le problème. Dois aimer Internet Explorer ... c'est comme un collègue agressif passif que vous ne pouvez tout simplement pas éviter.

+0

Échantillon de code pour nous à regarder? –

+0

Avez-vous ajouté 'session_start();' au-dessus de chaque page? – Alec

+0

Avez-vous inclus session_start(); en haut de chaque page? Oui. – Stuart

Répondre

2

En mettant cela comme une réponse (suggéré par l'utilisateur tuzo) pour le rendre plus facile à trouver. Résolu ceci. C'était le fait que le nom de domaine sur le serveur de test avait un trait de soulignement.Aucune idée pourquoi et ne pas avoir le temps de Google pour le moment, mais le trait de soulignement, nommé quelque chose comme some_client.ourcompany.com, était le problème. Dois aimer Internet Explorer ... c'est comme un collègue agressif passif que vous ne pouvez tout simplement pas éviter.

Pris d'un autre SO réponse ... explique exactement ce qui se passe: L'un des sous-domaines utilise-t-il un trait de soulignement? IE a des problèmes à accepter les cookies de sous-domaine qui ne suivent pas le RFC URI. (http://www.ietf.org/rfc/rfc2396.txt)

0

Essayez de mettre session_start(); . En haut de la page que vous faites les séances et vérifier si vous attribuez la session vars la bonne façon:

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

Qu'est-ce qui ne va pas avec l'OP? Aussi, si cela fonctionne dans tous les navigateurs sauf IE (s), il inclut évidemment 'session_start()' dans chaque page ... –

1

Vérifiez la valeur de session.cookie_domain dans votre fichier php.ini. Si cette valeur est définie, assurez-vous que c'est ce que vous attendez. C'est la plus grande chose que je puisse penser qui pourrait se comporter différemment localement vs distant. De plus, si vous avez défini une valeur sur session.cookie_lifetime, essayez de commenter cette ligne dans votre fichier php.ini. J'ai vu un comportement particulier avec IE quand j'ai laissé tomber une valeur là-bas.

Voici un vérificateur de session rapide. Si vous rechargez la page et continuez à voir de nouvelles valeurs pour le jeton, vous n'obtenez pas de session persistante. Ensuite, vous pouvez certainement blâmer le serveur/PHP config et pas votre code.

<?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

« Il était le fait que le nom de domaine sur le serveur de test avait un trait de soulignement dans ce » Ceci est tout à fait vrai. Ce post a été trouvé après avoir passé plus de 3 heures à régler le même problème. Un grand merci à gaoshan88

0

Nous avons rencontré le même problème, mais ce n'était pas le nom du serveur mais l'heure du serveur qui n'était pas correcte. Cela a causé l'invalidation instantanée de nos cookies de session dans IE alors qu'il fonctionnait sur d'autres navigateurs.

Questions connexes