【问题标题】:php session variable not working between different pagesphp会话变量在不同页面之间不起作用
【发布时间】:2013-03-21 14:35:55
【问题描述】:

我在 php 中创建了一个带有会话的简单登录页面,它在我的 LAMP 上运行良好。但是今天我不小心将我的 /var 目录的权限更改为 chmod 777 /var 之类的权限,尽管我将其权限更改回 chmod 755 /var 。但是现在当我再次尝试访问我的登录页面时,我无法登录。再次浏览代码时,我发现我的 SESSION 变量在传输到不同页面时没有保留其数据。我在每个页面(在页面顶部)都使用 session_start() ,而且我检查了 session_id() ,每个页面都是一样的。我在 linux 环境(Ubuntu 12.04)中使用 Apache 和 Mysql。我的程序代码:

index2.php:

<?php 
session_start();

if(isset($_SESSION['username'])) 
{
header('Location: securepage.php');
}
?>

<html>
<head>
    <title>Secure LOGIN</title>
</head> 
<body>
    <h2>User Login </h2>
    <form method="POST" action="login.php">
        <br>UserName : <input type= "text" name="username">
        <br>Password : <input type="password" name="password">
        <br><input type="submit" value="Login">
    </form>

</body>
</html>

登录.php:

<?php
session_start();
include('load.php');
$obj = new load();
$conn = $obj-> connect();

if(!conn)
{
exit('Connection cannot be established');

}

mysqli_select_db($conn,'login') or die('Cannot be established');
$query = "SELECT * FROM users WHERE uname='".$_POST['username']."' and pass =  '".md5($_POST['password'])."';";

$login = mysqli_query($conn,$query);


if(mysqli_num_rows($login) == 1)
{
$_SESSION['username'] = $_POST['username'];
 header('Location: securepage.php');
}
else
{
header('Location: index2.php');
}

?>

securepage.php:

<?php

session_start();


if (!isset($_SESSION['username'])) {
header('Location: index2.php');
}

?>
<html>

<head>
<title>Secured Page</title>
</head>

<body>

<p>This is secured page with session: <b><?php echo $_SESSION['username']; ?></b>
<br>You can put your restricted information here.</p>
</body>

</html>

echo $_SESSION['username'] 上,在 login.php 中的 if(mysqli_num_rows) 语句之后,它正确显示了 username 的值,但是在 >print_r($_SESSION) 在 securepage.php 中,它显示一个空数组。 这段代码直到昨天都运行良好,我不知道为什么它现在不起作用。
我什至创建了两个简单的测试页面来检查我的 SESSION 变量,但即使这样也不起作用。尽管 $_SESSION 中的值已设置,但它不会转移到第二页。我没有碰过我的 LAMP 的任何配置设置。

My phpinfo() screenshot
Permissions of var direcroty

请告诉我哪里出错了。

我的 error.log 的内容:

PHP Warning:  session_start(): open(/var/lib/php5/sess_mm4ja22k9n0r4gv512imc07ur0, O_RDWR) failed: Permission denied (13) in /var/www/public/index2.php on line 2, referer: http://localhost/index2.php

PHP Warning:  Unknown: open(/var/lib/php5/sess_mm4ja22k9n0r4gv512imc07ur0, O_RDWR) failed: Permission denied (13) in Unknown on line 0, referer: http://localhost/index2.php

PHP Warning:  Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php5) in Unknown on line 0, referer: http://localhost/index2.php

【问题讨论】:

  • 你检查过你的网络服务器(apache/nginx)的error.log吗?
  • 更新了我的 error.log 的内容。似乎是某种权限问题!

标签: lamp php


【解决方案1】:

你提到你做了chmod 777 然后回到755/var 目录(甚至可能是子目录)。你的问题是在那之后开始的,所以它似乎是一个权限问题。

/var 目录包含 www/ 文件夹,其中包含您的 Web 文档,但也包含其他文件夹(logtmp 等),如您的屏幕截图所示。 您知道您的 php 配置 (php.ini) 将您的 php 会话文件保存在哪里吗? 请查看session.save_path 行以确定。

默认值为/tmp,但您可能正在使用/var/tmp/var/lib/php5。问题是,/var/tmp 文件夹默认为chmod 777,所以你应该恢复到那个。

祝你好运!

【讨论】:

  • 感谢您的回答。在更改我的 /var/lib 的权限时,它现在工作正常。但是我遇到了另一个问题,在 sudo 上它显示:sudo: /var/lib/sudo writable by non-owner (040775), should be mode 0700
  • 问题是你应用的权限太宽了......你应该做chmod 777 -R /var/lib/php5而不是整个/var/lib目录......
  • 将 /var/lib/sudo 的权限更改为 0755 现在一切正常!
【解决方案2】:

这只是一个建议,因为我不确定是什么导致了问题。我犯了一个与权限相关的类似错误,导致我的所有脚本都无法正常工作,而/var/log/apache2/error.log 中没有记录任何错误。我做了以下来解决这个问题:

(在终端中)

:$ chmod 775 -R /var/www
:$ chown <user-name>:www-data -R /var/www

请注意,如果您不是 root 用户,则必须在前面加上 sudo

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    感谢 Smit 提供的有用建议。发现我的 /var/lib 没有组写权限。使用以下方法解决了问题:

    sudo chmod 775 -R /var/lib

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多