首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有绝对链接的奇怪的php会话行为

带有绝对链接的奇怪的php会话行为
EN

Stack Overflow用户
提问于 2011-03-19 00:27:11
回答 2查看 509关注 0票数 3

我已经观察到我的php应用程序在运行的服务器上表现得非常奇怪。当用户第一次访问应用程序并单击具有绝对路径的链接时,会话数据将被清除。

我尽可能简单地再现了这个问题。代码可以在下面找到。

我已经通过删除应用程序中的所有绝对链接()来解决这个问题--我只是在寻找对这个行为的解释。

要重新创建该问题:

  1. 点击‘登录’
  2. 单击“相对链接”并观察到会话仍然具有“logged_in”变量集
  3. 单击“绝对链接”并注意到会话数据似乎丢失
  4. 单击浏览器的后退按钮并观察会话数据已返回
  5. 单击“绝对链接”并观察会话数据再次丢失
  6. 单击'home (相对链接)‘并观察到这次会话数据丢失了
  7. 单击“登录”重置会话数据
  8. 再次单击“绝对链接”,并注意到这次会话数据未被清除

一些重要的事情要注意:

  • 在运行php5.3.2的mac上,这不是一个本地问题,而是运行php5.2.14的服务器和运行5.3.2的不同服务器上的问题。
  • 单击绝对链接,然后在没有登录的相对主链接中防止问题一旦登录就不会发生。
  • 一旦问题被刚才提到的方法解决了,它只能通过导航到另一个域、清除浏览器的缓存和导航回来重新创建。在不离开页面的情况下清除缓存将无法工作。
  • 如果在使用头重定向时使用绝对路径(“Location:.”),这也是一个问题。

index.php:

代码语言:javascript
代码运行次数:0
运行
复制
<?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:

代码语言:javascript
代码运行次数:0
运行
复制
<?php

    session_start();
    print_r($_SESSION);

?>
    <br/><a href="index.php">Home (relative link)</a>

login.php:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
    session_start();
    $_SESSION['logged_in'] = true;

    header('Location: index.php');

logout.php:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
    session_start();

    $_SESSION = array();
    session_destroy();

    header('Location: index.php');
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-19 01:49:07

解决问题:感谢Nouveau指出,cookie只能用于一个域,Scrum Meister则问我是否总是使用www访问该站点。

这个问题是通过从http://myserver.com开始并按照指向http://www.myserver.com的链接创建的。

会话是为http://myserver.com初始化的,然后是为http://www.myserver.com初始化的

票数 0
EN

Stack Overflow用户

发布于 2011-03-19 00:58:25

至少在您的示例中,页面在两个域(rhun.ithaca.edu和www.ithacahealth.org)之间切换。您会注意到,如果您在两个域上单击“登录”,那么在所有情况下都会有logged_in=1。不管怎样,这是问题的主要原因--两个不同的领域。

会话cookie与任何其他cookie并没有什么不同(从浏览器的角度来看),因此它们受到相同的限制--相关的限制是您必须在同一个域上。您可以用session_set_cookie_params()更改会话cookie设置(这必须在session_start(),之前完成,但即使这样,也不能允许从不同的域读取相同的cookie,如果需要,只能从子域读取。

此外,我不知道这是否相关,但将网页保留在单个域/子域上可能会对搜索引擎优化有所帮助--特别是在域/子域之间有不同内容的情况下,搜索引擎可能会认为它们是不同的网页,并在它们之间分割它们的pagerank。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5359137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档