【发布时间】:2020-07-07 21:59:26
【问题描述】:
我已经看到了许多在两个不同子域之间共享会话的解决方案,但它似乎对我不起作用。这是我的设置:
sub1.example.com(用户从这里开始)
sub2.example.com(PHP 文件包含在 sub1 中的文件中)
我使用以下代码在 sub2 包含的 PHP 文件中启动会话。会话永远不会直接在 sub1 上的文件中启动。
ini_set('session.cookie_domain', '.example.com' );
ini_set( 'session.cookie_httponly', 1 );
session_name( 'mySession' );
session_start();
我有一个存在于 sub2 上的 Javascript 文件,它也调用 sub2 中的 PHP 文件。但是,当我在 Javascript 文件调用的文件中使用 session_start() 时,会创建一个不同的会话,我通过从通过 sub1 调用的 PHP 文件和通过 Javascript 调用的 PHP 文件输出会话 ID 来确认这一点。
编辑 1:下面是对文件如何连接以及何时调用 session_start 的更好描述:
- 用户从 sub1 上的 index.php 开始。
- index.php 包括 sub2 上存在的 preload.php。会话在此处创建。
- 用户点击登录链接,从 sub2 调用 Javascript 文件中的函数。
- Javascript 从 sub2 调用 login.php。此处创建的会话与原始会话不匹配。
- 一旦用户成功登录,页面将被刷新并再次调用 preload.php。此处的会话与第 2 步中的会话相匹配。
编辑 2:这是调用 login.php 的 Javascript(和 jQuery):
function loginCheck()
{
var name = $('#logName').val();
var pass = $('#pass').val();
if (pass == '' || name == '')
return false;
var button = $('#loginSubmit');
$.post('SUB2ADDRESS/login.php', {name: name, pass: pass}, function(data){
button.bind('click', function() {loginCheck(); return false;});
if (!errorCheck(data))
location.reload();
});
}
【问题讨论】:
-
“会话永远不会直接在 sub1 上的文件中启动” ????这是什么意思? sub1 中的任何会话如果不启动,如何使用?
-
sub1 中的所有文件都包含 sub2 中的 PHP 文件。 session_start 代码位于 sub2 的包含文件中。
-
然后向我们展示您的实际 JavaScript 部分。很可能问题出在某个地方。您可能忽略了明确指示它与跨域请求一起传递 cookie。
-
您可能在这里有所收获。我使用的代码是原始的,只是托管在一个子域上,所以我不需要传递 cookie 信息。我刚刚发布了 Javascript 代码,希望你能告诉我我会在哪里做。
-
您的第 2 点没有意义。 PHP 包括通过文件系统进行的工作。您绝对不应该通过 HTTP 包含其他 PHP 文件