Alt etki alanları arasında PHP Oturumları

12 Cevap php

Ben şu kurmaya çalışıyorum:

auth.domain.com
sub1.domain.com
sub2.domain.com

kullanıcının ziyaret sub1.domain.com veya sub2.domain.com ve onlar açmış değil, onlar auth.domain.com üzerinden itti ve sub1.domain.com ve sub2.domain.com içeri giriş yapabilirsiniz iki ayrı uygulama ama aynı kimlik bilgilerini kullanmak.

Benim php.ini içinde aşağıdaki ayarı denedim:

session.cookie_domain = ".domain.com"

ama diğer bir etki bilgileri geçiyordum görünmüyor.

[Edit]

Ben şu çalıştı:

sub1.domain.com/test.php

session_set_cookie_params(0, '/', '.domain.com');
session_start();
print session_id() . "<br>";
$_SESSION['Regsitered'] = 1;
echo '<a href="http://auth.domain.com / test.php">Change Sites</a>'

auth.domain.com / test.php

session_set_cookie_params(0, '/', '.domain.com');
session_start();
print session_id() . "<br>";
$_SESSION['Checked'] = 1;
print_r($_SESSION);

Oturum kimlikleri tam olarak aynıdır ama ben $ _SESSION değişkeni dökümü zaman ben her etki altında ayarlanır, sadece ne olursa olsun anahtar, hem de tuşları görünmüyor.

[Edit 2]

Ben güncellendi [Düzenle]

12 Cevap

Cevaplarken ne zaman gelecek, diğerleri (yine aynı soruları sormak zorunda kalmadan) yardım arayan konuşma okumak olabileceğini akılda tutmak gerekir. Ama bunun yerine soru "alt etki alanları arasında bir seans kullanılabilir hale getirmek için nasıl" cevap, biz gerçekten soruya cevap vermez alanlarındaki bir oturum kimliğini nasıl alıyorsanız bulma yaşıyorum.

Örnekler (ve yok) çoğu durumlarda çalışabilir iken, mayın mutlaka diğer alt etki alanları için aşağıdaki linki olmayacaktır kullanıcı (lar) olarak biraz farklı. Ben "oturum" böylece kullanıcı, daha sonra tarayıcıyı kapatıp sub1.domain.com ziyaret ve daha sonraki bir zamanda (orijinal oturumu öncesinde sona eriyor) sub2.domain.com gidin ve hala olabilir gerek. Bu alışkanlık bir bağlantı veya başka bir id ileterek çalışır.

Tür zaten yayınlanan yorumlar dışında benim için ortaya çıktı Bir soru, nasıl SQL veritabanında bir oturum kimliğini kaydetmek ve daha sonra doğru bir çekin mümkün olurdu? Yani, benimle sokmak yürümek: Burada her şey belirli bir kullanıcı tespit edebilmek için - bu yüzden onlar bir kimliği atanmalıdır. Oturum Kimliği yok sadece. Ama çapraz subdomain oturumları almaya çalışırken çoğu kişi biz kullanıcıyı tanımlamak gerekiyor çünkü onların kullanıcıları mysql veritabanı oturumu olan bütün noktası yendi her alt alan için birden çok kez giriş yapmak istemiyorum.

Peki nasıl yapılıyor? Ben şimdi bunu düşünüyorum, bir fikir, oturum açma komut adı / pass $ _GET kullanmak için izin olacak ve üzeri her bir alt etki komut giriş olurdu sanırım:

$login_sub1 = file_get_contents("sub1.domain.comv");
$login_sub2 = file_get_contents("sub21.domain.comfile_get_contents("sub1.domain.com");

Sonra başarı / hata mesajları için sayfaları eregi olabilir .... ama böyle basit bir görev için bir çalışma TON bulunuyor.

Ben son 3 saat boyunca Google'da her sonuca bakarak edilmiştir ve bu anlamaya olamaz.

Ben php.ini dosyaları düzenlediğiniz ve php kendilerini dosyaları, ben sadece bu anlamaya olamaz, ben arkadaş çağırdı, benim hosting şirketi aradım. Ama ben bu anlamaya eğer ben adım kılavuz bir adım yazacağım, sana ne söyleyeyim.

İşte ne var:

Apache / PHP with Host Gator (August 21, 2009).

php.ini, her subdomain ve ana etki kök dosyasını, her ini dosyası sadece yaklaşık olarak aynı.

Ben satırları düzenledikten -

session.cookie_domain = .domain.com
session.save_path = /home/user/domains/sessions

sub1.domain.com I $_SESSION['userid'] içinde kimliği saklar ve üstünde bir giriş var ben var:

//ini_set("session.cookie_domain", ".domain.com");
session_start();

Sub2.domain.com, ben üstünde bu var:

//ini_set("session.cookie_domain", ".domain.com");
session_start();
echo "SESSION USERID: \"".$_SESSION['userid']."\"";

sub2.domain.com şey ini_set satırları yorumlama sub1.domain.com. Ben denedim un içine giriş yaptıktan sonra, malzeme farklı kombinasyonları ... Ben önemli bir şey eksik göstermez ve ne dışarı Figue olamaz.

Eğer bir fikriniz varsa bunu duymak isteriz. Şimdiden teşekkürler!

~ John

Sorun hala varsa ben bilmiyorum, ama ben sadece aynı sorun koştu ve session_set_cookie_params çağırmadan önce bir oturum adı ayarlama münhal ():

$some_name = session_name("some_name");
session_set_cookie_params(0, '/', '.some_domain.com');
session_start();

Ben benim php.ini hiçbir şey değişti ama şimdi her şey iyi çalışıyor.

Gizemli tanımlama doğru .domain.com PHP Suhosin yama ayarlanmış olmasına rağmen, bir alt etki alanı üzerinde okunan oturum verileri önleyebilirsiniz bir şey. Her şeyi söz örnekler gibi, doğru olarak yapılandırılmış olabilir ve sadece çalışamaz.

Aşağıdaki Suhosin oturum ayarlarını kapatın ve iş geri konum:

suhosin.session.cryptua = Off 
suhosin.session.cryptdocroot = Off

Kullanmayı deneyin:

session.cookie_domain = "domain.com"

Yerine:

session.cookie_domain = ".domain.com"

Eksik süre not edin.

Tüm tarayıcılar tarafından desteklenmediği için, olsa da, bu kullanırken dikkatli olun.

Tam bu sorun vardı - Ben example.local ve tersi geçerli olmak x.example.local üzerinde oluşturulan oturum değerlerini istedi.

All solutions I found said to change the Session domain by using php_value session.cookie_domain .example.local in .htaccess (or via php.ini or via ini_set).

Catch Ben (şimdiye kadar ok) tüm alt etki alanları için session.cookie_domain ayarı aynı zamanda ana etki alanı için oldu. Ana etki session.cookie_domain Ayar görünüşte bir hayır-hayır.

Bu benim için çalıştı temelde yolu:

  • set the session.cookie_domain tüm alt etki alanları için.
  • don't set it for the main DOMAIN

Ah evet, etki bir TLD olduğundan emin olun (benim durumumda. Yerel). Http protokolü (yani localhost çalışmaz, ama stuff.localhost olacak) kurabiye / oturumları. Tld olmadan bir etki saklanmasına izin vermez.

EDIT: Ayrıca her zaman tarayıcınızın çerezleri temizlemek emin olun alt alanda test / hata ayıklama oturumları sırasında. Bunu yapmazsanız, tarayıcınız her zaman muhtemelen doğru cookie_domain henüz set yok eski oturum çerez gönderir. Sunucu eski oturumu canlandırmak ve bu nedenle yanlış negatif sonuçlar alırsınız. (Birçok mesaj o aynı etki için session_name ('şeyler') kullanmak için belirttiğim)

Seni Joel gibi OpenID, gibi bir şey düşündüren istemiyorum fikir olsun, ama birden çok etki alanında oturum verilerine erişim olmasını istediğiniz.

Ben bu sorun için bir çözüm olarak düşünebilirsiniz tek olasılık, bir veritabanında sessiondata depolamak ve bu veritabanı üzerinden çekin etmektir.

Ben bu eski olduğunu biliyorum ama bu aynı kutu üzerinde birden çok etki alanları ve alt etki alanları ile birlikte benim için çalışıyor.

<?php
define('site_domain','domain.com');
session_set_save_handler('_open',
                         '_close',
                         '_read',
                         '_write',
                         '_destroy',
                         '_clean');

function _open(){

    global $_sess_db;

$db_user = 'user';
$db_pass = 'pass';
$db_host = 'localhost';

if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass)){

    return mysql_select_db('database', $_sess_db);

}

return false;

}

function _close(){

    global $_sess_db;
    return mysql_close($_sess_db);

}

function _read($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "SELECT data
    FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

     if ($result = mysql_query($sql, $_sess_db)){

         if (mysql_num_rows($result)){
             $record = mysql_fetch_assoc($result);
             return $record['data'];
        }

    }

    return '';

}

function _write($id, $data){

    global $_sess_db;
    $access = time();

    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "REPLACE INTO sessions
    VALUES ('$id', '$access', '$data', '$domain', '$agent')";

    return mysql_query($sql, $_sess_db);

}

function _destroy($id){

    global $_sess_db;
    $id = mysql_real_escape_string($id);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE id = '$id' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

function _clean($max){

    global $_sess_db;
    $old = time() - $max;
    $old = mysql_real_escape_string($old);
    $domain = mysql_real_escape_string(site_domain);
    $agent = mysql_real_escape_string(isset($_SERVER['HTTP_USER_AGENT']));

    $sql = "DELETE FROM sessions
    WHERE  access < '$old' AND domain = '$domain' AND agent = '$agent'";

    return mysql_query($sql, $_sess_db);

}

>

Ben böyle çözülür

ini_set('session.cookie_domain', '.testdomain.dev');
session_start();

Ben localhost üzerinde çalışıyordu çünkü

ini_set('session.cookie_domain', '.localhost');

wasn't working, bunun yerine .com / .local / ve ... toplevel olarak localhost. Görüyor (sanıyorum)

Ben de kullandım. Dev OS X üzerinde çalışan çözmek için görünmüyor çünkü. HOSTS ilk olarak com

Bunu kullanın, çalışır:

ini_set('session.cookie_domain', 
    substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));

Yukarıda bütün cevapları okudum, benim cevap bu Googling insanlar için yararlı olduğunu düşünüyorum.

* tarayıcılar ". Example.com" olarak oturum tanımlama etki alanını ayarlamak, (adları ve alt etki alanları) geri sunucularına oturum çerezi göndermek emin olun.

* Make sure php find the right "target" to restore session var - If domain and subdomains point to the same machine (maybe different virtual hosts), make sure "session_save_path" is the same for all (I tested) - If domain and subdomains point to different machines, the common storage (like database) is best for saving and restoring session data (I didn't test yet). Use "session_set_save_handler" to do that.

Her domain / subdomain kullanın:

session_name('name');
ini_set('session.cookie_domain', '.example.com');
ini_set('session.save_path', '/var/lib/php/session');
session_start();

session.save_path durum için farklı olabilir ama her domain / subdomain same olmalıdır için yol. Varsayılan olarak her zaman doğru değildir.

Hızlı ve kirli bir çözüm yönlendirme için bu kullanmak için:

header( $url.'?'.session_name().'='.session_id() );

Bu PHP kullanmak gerekir session id söyler URL,? PHPSESSID = etnm7kbuf5lg0r6tv7je6ehtn4 çizgisinde bir şeyler katacak.