PHP会话文件的权限

时间:2009-05-26 18:42:20

标签: php apache file session

我有一个域domain.com和subdomain sub.domain.com这两个域在linux环境中有不同的ftp用户(user1,user2)属于同一组(usergroup)。最后,我有相同的PHP应用程序在两个域上使用会话(一个是实时的,另一个是测试环境)。

当我在不首先访问sub.domain.com的情况下访问domain.com时,PHP会话文件在默认文件夹/ tmp /中创建,具有适当的权限600和user1:usergroup,当我访问sub.domain.com而不去首先访问domain.com,使用权限600和user2:usergroup创建文件。

一切都非常适合所有浏览器,但IE(请不要专注于此)。我发现当我访问sub.domain.com然后尝试domain.com时,PHP尝试读取相同的会话文件,但没有权限,页面无限期加载。将文件的所有权更改为user1会使domain.com正常工作,但会阻止sub.domain.com工作。

如何使Apache或PHP为会话创建不同的文件或使它们可以从两个域访问。

P.S。 就像我说的一些奇怪的原因,这只发生在IE上,PHP的错误信息是: 未捕获的PHP错误:session_start()[function.session-start]:open(/ tmp / sess_t1 ...,O_RDWR)失败:第46行的文件xxx.php中的权限被拒绝(13) 第46行的第二行是session_start();

感谢您提出任何建议。

4 个答案:

答案 0 :(得分:3)

不确定这是否是解决问题的最佳方法,但您可以尝试在每个域的不同目录中保存PHP会话文件。

查看session_save_path()文档。

请记住,您必须在初始化会话之前进行设置 理想情况下,这应该是您的脚本所做的第一件事。

答案 1 :(得分:1)

您确定IE正在触发此问题吗?

浏览器没有对会话文件的任何直接访问权限,只有PHP(HTTPD)进程才能访问会话文件。

我不明白为什么一个浏览器应该在PHP日志中提供不同的错误消息。

我认为你可能会处理两个不同的问题。

答案 2 :(得分:1)

一种解决方案是将其添加到每个子域的.htaccess文件中:

php_value session.save_path '/path/to/a/writeable/folder'

然后确保每个子域都有权写入自己的文件夹。

答案 3 :(得分:1)

我刚遇到同样的问题。 Apache为IE7和IE8返回会话数据的方式似乎存在问题,但很可能是因为IE7和IE8有一种不正当的方式宣布他们正在请求会话数据的域。

这是我的情景:

运行具有两个域的Apache 1.3,每个域都有自己的帐户和自己的用户:

Domain: mycompany.com 
Session path: /tmp/
Webserver user: mycompanycom

Domain: support.mycompany.com 
Session path: /tmp/
Webserver user: nobody

以下是使用Firefox / Safari / Chrome进行正常访问时发生的情况:

  1. 我访问mycompany.com,会话文件在用户/tmp/拥有的mycompanycom中创建。
  2. 然后访问support.mycompany.com,第二个会话文件在用户/tmp/拥有的nobody中创建。
  3. Apache不会感到困惑,并且会返回正确的会话文件
  4. 然而,这是在访问IE7和IE8期间发生的事情:

    1. 我访问mycompany.com,会话文件在用户/tmp/拥有的mycompanycom中创建。
    2. 然后访问support.mycompany.com,而不是在用户/tmp/拥有的nobody中创建第二个会话文件,Apache尝试返回mycompany.com的会话文件。
    3. mycompany.com的会话文件由用户mycompanycom拥有,因此以用户nobody身份运行的Web服务器无法访问它。许可被拒绝。
    4. 正如其他人所建议的那样,解决方案是在/tmp/中创建一个单独的目录,以便为support.mycompany.com分隔存储的会话数据:

      mkdir /tmp/mycompany
      chown nobody:nobody /tmp/mycompany
      

      然后我将以下内容添加到根网站目录中的.htaccess文件中,以供support.mycompany.com使用:

      php_value session.save_path '/tmp/mycompany'
      

      最后,我删除了/tmp/中的所有现有会话数据,以确保立即使用新的会话路径:

      rm -f /tmp/sess_*
      

      就是这样!现在IE7和IE8正常工作。

      我很确定这个问题与IE7和IE8如何从Apache请求会话数据有关。他们可能首先请求mycompany.com的会话数据,然后请求support.mycompany.com的会话数据,即使后者是在地址栏中输入的唯一doman。

相关问题