奇怪的PHP会话行为与绝对链接

时间:2011-03-19 00:27:12

标签: php

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

我尽可能简单地重新创建了问题。代码可以在下面找到。

我通过删除应用程序中的所有绝对链接解决了这个问题,我只是在寻找对此行为的解释

要重新创建问题:

  1. 点击“登录”
  2. 点击“相对链接”,观察会话仍然设置了“logged_in”变量
  3. 点击“绝对链接”并观察会话数据似乎缺失
  4. 点击浏览器的后退按钮,观察会话数据是否已返回
  5. 点击“绝对链接”并观察会话数据是否再次丢失
  6. 点击'主页(相对链接)'并观察此次会话数据丢失
  7. 点击“登录”以重置会话数据
  8. 再次点击“绝对链接”并观察此次未清除会话数据
  9. 需要注意的一些重要事项:

    • 这不是我本地的问题 mac使用php 5.3.2运行MAMP, 但是在服务器上有问题 php 5.2.14和另一台运行5.3.2的服务器
    • 单击绝对链接,然后在没有登录的情况下保存相对主页链接可以防止在您登录后出现问题。
    • 一旦问题通过刚刚提到的方法解决,它只能通过导航到不同的域,清除浏览器的缓存并导航回来重新创建。在不离开页面的情况下清除缓存将不起作用。
    • 如果在使用标题重定向时使用绝对路径('Location:...'),这也是一个问题

    的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');
    

2 个答案:

答案 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