2010-07-28 11 views
0

Nous avons un serveur CentOS 5.4 servant un certain nombre de nos sites Web. Le serveur est géré par Plesk 9.2.3. Nos sites sont développés en php.PHP ne sauvegarde pas les sessions sur le sous-domaine, ok sur le domaine

Nous avons notre domaine principal ourapplication.co.uk dans /var/www/vhosts/ourapplication.co.uk/httpdocs et notre sous-domaine api.ourapplication.co.uk dans/var/www/vhosts/ourapplication/subdomains/api/httpdocs

Les pages suivantes sont dans les deux endroits:

davidstest1.php

<?php 
session_start(); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<meta http-equiv="X-UA-Compatible" content="IE=7" /> 
<title>Code Blue Stats</title> 
<link rel="stylesheet" type="text/css" href="css/style.css" /> 
</head> 
<body> 
<?php 
echo "This is Davids Test 1. It will set SESSION['davids']='davids variable set' and then link 
to davidstest2.php<br /> 
davidstest2 wil then do a session_start() call, and attempt to display SESSION['davids'] <br />"; 
$_SESSION['davids']='davids variable set'; 
?> 
<a href="davidstest2.php">davidstest2.php</a> 
</body> 
</html> 

davidstest2.php

<?php 
session_start(); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<meta http-equiv="X-UA-Compatible" content="IE=7" /> 
<title>Code Blue Stats</title> 
<link rel="stylesheet" type="text/css" href="css/style.css" /> 
</head> 
<body> 
<?php 
echo "This is Davids Test 2. It will do a session_start() call, and attempt to display SESSION['davids'] <br />"; 
$r=print_r($_SESSION, true); 
echo "<pre>Session in <br />"; 
echo $r; 
echo "<br /></pre>"; 
?> 
<a href="davidstest2.php">davidstest2.php</a> 
</body> 
</html> 

dans le domaine principal, davidstest2 retourne

This is Davids Test 2. It will do a session_start() call, and attempt to display SESSION['davids'] 
Session in 
Array 
(
    [siteMode] => none 
    [davids] => davids variable set 
) 
davidstest2.php 

dans le sous-domaine api, davidstest2 retourne

This is Davids Test 2. It will do a session_start() call, and attempt to display SESSION['davids'] 
Session in 
Array 
(
) 
davidstest2.php 

De toute évidence, quelque chose dans la configuration Apache ou la config Php est faux, comme la variable de session doit être stockée pour les deux domaines

Relevant phpinfo() reports: 
Session Support enabled 
Registered save handlers files user 
Registered serializer handlers php php_binary wddx 
session.auto_start Off Off 
session.bug_compat_42 Off Off 
session.bug_compat_warn On On 
session.cache_expire 180 180 
session.cache_limiter nocache nocache 
session.cookie_domain no value no value 
session.cookie_lifetime 0 0 
session.cookie_path//
session.cookie_secure Off Off 
session.entropy_file no value no value 
session.entropy_length 0 0 
session.gc_divisor 1000 1000 
session.gc_maxlifetime 1440 1440 
session.gc_probability 1 1 
session.hash_bits_per_character 5 5 
session.hash_function 0 0 
session.name PHPSESSID PHPSESSID 
session.referer_check no value no value 
session.save_handler files files 
session.save_path /var/lib/php/session /var/lib/php/session 
session.serialize_handler php php 
session.use_cookies On On 
session.use_only_cookies Off Off 
session.use_trans_sid 0 0 

Des idées où commencer à chercher?

+0

Je ne comprends pas encore entièrement. Vous attendez-vous à ce que le cookie de session soit transporté de domaine en sous-domaine? –

+0

Non, non. api et l'application principale sont séparés. Juste que les cookies utilisés dans notre application sont bien, mais les cookies mis en api.ourapplication ne sont pas réglés. –

+1

Ça pourrait être juste moi, mais il semble y avoir des discussions contradictoires entre ce dernier commentaire et votre conversation sous la réponse de Gumbo. Une grande partie de ce que dit Gumbo semble être d'obtenir api.domain.com et domain.com pour partager des données de session. Si vous dites que le problème est simplement que api.domain.com n'enregistre pas le cookie de session, alors c'est une question différente. –

Répondre

1

session.cookie_domain doit être réglé en fonction du réglage de domaine du cookie expliqué dans http://php.net/setcookie

fonction

session_set_cookie_params() est souvent utilisé pour cette

3

Set session.cookie_domain à .ourapplication.co.uk (notez le point au début) d'avoir la Les cookies de session sont valables pour ourapplication.co.uk et tous ses sous-domaines.

+0

Vous n'êtes pas sûr des implications pour cela. Notre serveur web héberge au moins 4 domaines, tous séparés, desservis par des domaines virtuels Apache (pour une raison quelconque sur une adresse IP différente, mais pas sur ma zone). Tous développés en PHP et tous utilisent des cookies. Donc, dire que nous avions business1.co.uk, api.business1.co.uk, sellingstuff.com, werereallygreat.co.uk, anotherbusiness.com, session.cookie_domain serait mauvais pour la plupart des sites. Il n'y a qu'un seul php.ini.En outre, les sessions fonctionnent pour tous les domaines supérieurs, mais pas pour les sous-domaines générés par plesk. Pouvez-vous expliquer davantage? –

+2

@WaveyDavey: * session.cookie \ _domaine * est modifiable dans n'importe quel contexte (voir http://php.net/configuration.changes.modes). Vous pouvez donc le modifier dans un fichier .htaccess en utilisant 'php_value' (voir http://php.net/configuration.changes) ou vous pouvez utiliser la fonction' session_set_cookie_params' déjà mentionnée. – Gumbo

+0

J'aimerais avoir travaillé! Au début de chaque page je mets ini_set ('session.cookie_domain', '.myapplication.co.uk'); et un ini_get montre que cela avait pris. Mais toujours pas d'informations de session passées entre les pages lorsque j'accède à api.myapplication.co.uk/davidstest1.php et davidstest2.php. Maintenant * vraiment * bloqué. –