Ich bin zwar mit beiden Domains beim gleichen Hoster aber dieser meinte es kann innerhalb von einem Account auch sein, dass eine Domain auf Server A und die zweite auf Server X liegt.
Das innerhalb eines Accounts zwei Domains auf zwei verschiedenen Servern liegen dürfte hinsichtlich der Account- und Domainverwaltung aus technischen Gründen technisch ziemlich schwierig zu händeln sein. Das geht schon bei disk-quotas (die ja für den vertrag und also den Account gelten) los. Ansonsten müsste man sich darüber unterhalten, was mit "Server" gemeint ist, und da würde ich von der Kiste ausgehen, die den eigentlichen Webserver (häufig: Apache) beherbergt.
Was gibt denn
<pre><?php
echo $_SERVER['DOCUMENT_ROOT']
. "\n"
. $_SERVER['SERVER_ADDR'];
?>
auf den jeweiligen Domains aus?
Die IP Adresse von einem Client aus via DNS aufzulösen bringt nichts, weil da Proxys dazwischen sein können. Sowohl auf der Clientseite als auch auf der Serverseite kann das "transparent" geschehen, also so dass im öffentlichen DNS der Domainname auf die IP des Proxys zeigt. So kann z.B. ein "halbes Rechenzentrum" nach außen die öffentliche IP eines Proxys haben, der dann die Requests nur an die eigentlichen Server - mit vielleicht sogar privaten IPs (z.B. aus dem Adressbereich 10.x.x.x/8) verteilt. Insofern kann die Auflösung also die Täuschung erwecken, dass die Webseiten zweier oder mehr Domains auf dem gleichen Server liegen.
$_SERVER['SERVER_ADDR']
zeigt Dir also die "endgültige" IP aus Serversicht. Die wäre hier womöglich aussagekräftiger.
Kommen wir zur eigentlichen Session und zum Experiment
Ich hab damit ein wenig rumgespielt, das Folgende hat nur Testcharakter, es soll Dich zum Weiterdenken animieren, es ist kein fertiger Code!
Der Krempel wird dann funktionieren,
- wenn beide Domains auf dem gleichen Server liegen
- und das Verzeichnis für die Session-Dateien identisch ist
- und Du musst Dich ggf. noch um CORS-Einträge kümmern.
Liegen die Session-dateien nicht auf den gleichen Server muss beim Session-Transfer dafür gesorgt werden, dass die Session-Datei vom Server A zum Server B kopiert wird. Das geht mit PHP eigentlich ganz einfach.
$sessTransferKey hat (noch) keine Bedeutung.
A) Erzeugung der Session auf Domain A:
<?php
$serverA='https://home.fastix.org';
$serverB='https://home.fastix.org';
if (! session_id() ) {
session_start();
}
if ( ! isset( $_SESSION['foo'] ) ) {
$_SESSION['foo'] = 'bar';
}
if ( ! isset( $_SESSION['TransferKey'] ) ) {
$_SESSION['TransferKey'] = generateTransferKey();
}
$sessionFileName = ini_get('session.save_path') . '/sess_' . session_id() ;
echo '<p>Session-ID: ' . session_id() . '</p>';
echo '<p>Session-File: ' . $sessionFileName . '</p>';
echo '<hr><pre>' . htmlspecialchars( file_get_contents ( $sessionFileName ) ) . '</pre></hr>';
echo '<p>Gehe zu <a href="' . $serverB . '/Tests/session_use.php">' . $serverB . '/Tests/session_use.php</a></p>';
function generateTransferKey() {
$blob = '';
for ( $i=0; $i<160; $i++ ) {
$blob .= chr( random_int( 1,126 ) );
}
return base64_encode( $blob );
}
b) "Antelefonieren" der Session von einer Seite von Domain B aus mit Javascript
<html>
<head></head>
<body>
<p>Session ID: <span id="sessID"></span></p>
<p>Session TransferKey: <span id="sessTransferKey"></span></p>
<p>Session Transfer ausgeführt: <span id="TranferOK"></span></p>
</body>
<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if ( this.readyState == 4 && this.status == 200 ) {
vars = JSON.parse( this.responseText );
document.getElementById('sessID').innerHTML = vars['sessID'];
document.getElementById('sessTransferKey').innerHTML = vars['sessTransferKey'];
var xhttp2 = new XMLHttpRequest();
xhttp2.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById('TranferOK').innerHTML = this.responseText;
}
};
xhttp2.open( "POST", "https://home.fastix.org/Tests/sessiontransfer.php", true );
xhttp2.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
data = 'sessID=' + encodeURIComponent( vars['sessID'] )
+ '&TransferKey=' + encodeURIComponent( vars['sessTransferKey'] );
xhttp2.send( data );
}
};
xhttp.open( "GET", "https://home.fastix.org/Tests/sessionGetIDandTransferKey.php", true );
xhttp.send();
</script>
</html>
C) Und zu guter Letzt die "sessiontransfer.php", für die eigentlich nur mit session_id() die frühere id zu setzen ist, der Rest geht automatisch mit session_start() - Aber nur wenn die Session-Datei vorhanden ist!
<pre>
Postdata:
<?php
print_r( $_POST );
?>
SESSION:
<?php
session_id( $_POST['sessID'] );
session_start();
print_r( $_SESSION );
?>
</pre>
wenn Du die Session-Datei kopierst, dann musst Du ferner Sorge dafür tragen, dass im Falle einer Abmeldung das Original und alle Kopien zuverlässig zerstört (gelöscht) werden.