我已经观察到我的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');
发布于 2011-03-18 17:49:07
解决问题:感谢Nouveau指出,cookie只能用于一个域,Scrum Meister则问我是否总是使用www访问该站点。
这个问题是通过从http://myserver.com开始并按照指向http://www.myserver.com的链接创建的。
会话是为http://myserver.com初始化的,然后是为http://www.myserver.com初始化的
发布于 2011-03-18 16:58:25
至少在您的示例中,页面在两个域(rhun.ithaca.edu和www.ithacahealth.org)之间切换。您会注意到,如果您在两个域上单击“登录”,那么在所有情况下都会有logged_in=1。不管怎样,这是问题的主要原因--两个不同的领域。
会话cookie与任何其他cookie并没有什么不同(从浏览器的角度来看),因此它们受到相同的限制--相关的限制是您必须在同一个域上。您可以用session_set_cookie_params()更改会话cookie设置(这必须在session_start(),之前完成,但即使这样,也不能允许从不同的域读取相同的cookie,如果需要,只能从子域读取。
此外,我不知道这是否相关,但将网页保留在单个域/子域上可能会对搜索引擎优化有所帮助--特别是在域/子域之间有不同内容的情况下,搜索引擎可能会认为它们是不同的网页,并在它们之间分割它们的pagerank。
https://stackoverflow.com/questions/5359137
复制