我观察到我的php应用程序在运行它的服务器上表现得相当奇怪。当用户首次访问应用程序并单击具有绝对路径的链接时,会话数据将被清除。
我尽可能简单地重新创建了问题。代码可以在下面找到。
我通过删除应用程序中的所有绝对链接解决了这个问题,我只是在寻找对此行为的解释。
要重新创建问题:
需要注意的一些重要事项:
的index.php:
<?php
session_start();
print_r($_SESSION);
?>
<br/><a href="http://www.myserver.org/page.php">Absolute link</a>
<br/><a href="page.php">Relative link</a>
<br/><a href="login.php">Log in</a> | <a href="logout.php">Log out (reset session)</a>
page.php文件:
<?php
session_start();
print_r($_SESSION);
?>
<br/><a href="index.php">Home (relative link)</a>
的login.php:
<?php
session_start();
$_SESSION['logged_in'] = true;
header('Location: index.php');
logout.php:
<?php
session_start();
$_SESSION = array();
session_destroy();
header('Location: index.php');
答案 0 :(得分:3)
至少在您的示例中,页面在两个域之间切换(rhun.ithaca.edu和www.ithacahealth.org)。您会注意到,如果您在两个域上单击“登录”,那么在所有情况下您都将使用logged_in = 1。无论如何,这是问题的主要原因 - 两个不同的领域。
会话cookie与任何其他cookie(从浏览器的角度来看)没有区别,因此它们受到相同的限制 - 相关的限制是您必须在同一个域中。您可以使用 session_set_cookie_params()更改会话Cookie设置(必须在 session_start()之前完成,但即便如此,您也不能允许从不同的域,只有来自子域,如果你需要它。
此外,我不知道它是否相关,但将网页保留在单个域/子域可能对搜索引擎优化有所帮助 - 特别是在域/子域,搜索引擎之间存在不同内容的情况下可能会认为它们是不同的网页,并将它们之间的分页分开。
答案 1 :(得分:0)
解决: 感谢Nouveau指出cookie只能用于一个域而Scrum Meister可以询问我是否总是使用www访问该站点。
问题是通过从http://myserver.com开始并点击http://www.myserver.com
的链接创建的会话已初始化为http://myserver.com,然后再次针对http://www.myserver.com