2017-06-19 3 views
0

Ich habe die Domäne jdavis.software und zwei Subdomains om.jdavis.software und api.jdavis.software haben. Ich versuche einfach, einen asynchronen (Ajax) Anruf von der om zu der api, die eine $_SESSION Variable setzt, dann laden Sie die gleiche om Seite und zeigen Sie die Sitzung. Ich habe die session.cookie_domain = .jdavis.software in meiner php.ini festgelegt, so dass Sitzungserstellung von der gleichen Stammdomäne ist.Sitzungsverwaltung - Cross Subdomains

Domains:

Apache vhost config: (sowohl für Unterdomänen und ihre relativen Verzeichnisse)

AllowOverride All 
Header set Access-Control-Allow-Credentials "true" 
Header set Access-Control-Allow-Origin "*" 

api.jdavis.software/test.php

<?php  
session_start(); 

function test(){ 
    $_SESSION['test'] = 123; 
} 
test(); 
print_r($_SESSION); 
exit(); 
?> 

om.jdavis.software/index.php

<?php 
    session_start();  
    print_r($_SESSION); 
?> 

<!DOCTYPE html> 
<html> 
<head> 
     <script>    
     var ajax = function(data){ 
     http = new XMLHttpRequest(); 
     http.open((data.method) ? data.method : "POST", (data.url) ? data.url : "/"); 
     http.send(data.params); 
     http.onreadystatechange=()=>{ 
     if(http.status != 404){ 
      http.addEventListener("load", data.callback); 
      } 
      else{ 
       console.log("Error: Issue with server call..."); 
      } 
     } 
     }; 
     function submitForm(form) { 
      var form = new FormData(form); 
      ajax({ 
       url: "http://api.jdavis.software/test.php", 
        method: "POST", 
       params: form, 
       callback: function(e){ 
       console.log(e.target.response); 
       } 
      }); 
      event.stopPropagation(); 
      event.preventDefault(); 
      return false; 
     };   
     </script>  
</head> 
<body> 
    <form onSubmit="submitForm(this);"> 
     <input type="submit"> 
    </form> 
</body> 
</html> 

Die sessions_id-Gruppen sind gleich, und wenn ich print_r($_SESSION) nachdem ich Führen Sie den Ajax-Anruf und laden Sie die Seite neu, druckt nicht einmal die ID ...

Frage: Warum sind nicht die $_SESSION Variablen drucken?

+0

Sie müssen uns alle relevanten Code zeigen. Bitte lesen Sie: [Wie erstellt man ein minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) und auch [Wie stelle ich eine gute Frage?] (Http://stackoverflow.com/ help/how-to-ask) –

+0

@MagnusEriksson es ist buchstäblich '$ _SESSION ['test'] = 123' in meinem Code nach der Authentifizierung erfolgreich ist, die Cookies (session_id) ist die gleiche auf beiden aber wenn ich' var_dump ($ _ SESSION) 'nichts druckt aus. –

+0

Haben Sie die Sitzungscookie-Domain so eingerichtet, dass sie den Subdomains entspricht? Haben Sie 'session_start()' vor dem Setzen/Lesen der '$ _SESSION' super global? Haben Sie "PHP-Sitzungen über Sub-Domains" gegooglet? Das Problem, wenn wir den Code nicht sehen können, ist, dass wir keine Ahnung haben, was Sie getan haben/nicht getan haben, und wir müssen entweder anfangen zu raten oder nach allem zu fragen. –

Antwort

0

Ich bin zu dem Schluss gekommen, dies zu meiner headers.conf Datei hinzuzufügen, die dynamisch die Origin-Domäne im laufenden Betrieb hinzufügen wird, solange es in der Liste ist.

Grundsätzlich wird Apache auf den Ursprung hören und wenn es eine der Domänen im Regex-Muster entspricht dann Header add Access-Control-Allow-Origin.

<IfModule mod_headers.c> 
     SetEnvIf Origin "http(s)?://(om\.)?(jdavis.software|google.com|whatever|domains|you|want)$" AccessControlAllowOrigin=$0 
     Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin 
</IfModule>