【问题标题】:session management - cross subdomains会话管理 - 跨子域
【发布时间】:2017-11-22 04:25:00
【问题描述】:

我有域 jdavis.software 并有两个子域 om.jdavis.softwareapi.jdavis.software。我只是尝试从om 到设置$_SESSION 变量的api 进行异步(ajax)调用,然后重新加载相同的om 页面并显示会话。我在 php.ini 中设置了session.cookie_domain = .jdavis.software,以便会话创建来自同一个根域。

域:

Apache vhost 配置:(用于子域及其相关目录)

 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>

sessions_id 是相同的,当我 print_r($_SESSION) 在我运行 ajax 调用并重新加载页面后,没有任何东西打印甚至 id...

问题:为什么$_SESSION 变量没有打印出来?

【问题讨论】:

  • 您需要向我们展示所有相关代码。请阅读:How to create a Minimal, Complete, and Verifiable exampleHow do I ask a good question?
  • @MagnusEriksson 在身份验证成功后,我的代码中的字面意思是 $_SESSION['test'] = 123,cookie(session_id)在两者上都是相同的,但是当我 var_dump($_SESSION) 没有打印出来时。
  • 您是否设置了会话 cookie 域以匹配子域?在设置/读取$_SESSION 超级全局之前你有session_start() 吗?您是否在 Google 上搜索过“跨子域的 php 会话”?当我们看不到代码时,问题是我们不知道你已经/没有做过什么,我们需要开始猜测或询问每一件事。
  • @MagnusEriksson 是的,我在 .htaccess 文件中设置了根域 .domain.com 和两个子域上的会话 ID 匹配。

标签: php session cross-domain session-cookies


【解决方案1】:

我已经得出结论,将其添加到我的headers.conf 文件中,只要它在列表中,它就会动态添加原始域。

基本上 Apache 会监听 origin,如果它匹配正则表达式模式中的域之一,那么 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-17
    • 2014-09-25
    • 2014-05-10
    • 1970-01-01
    • 2012-08-04
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多