对PHP会话文件的权限

对PHP会话文件的权限,php,apache,file,session,Php,Apache,File,Session,我有一个domain.com和subdomain sub.domain.com这两个域在linux环境中有属于同一组(usergroup)的不同ftp用户(user1,user2)。最后,我有一个在两个域上使用会话的PHP应用程序(一个是live,另一个是testing environment) 当我访问domain.com而不首先访问sub.domain.com时,PHP会话文件将在默认文件夹/tmp/中创建,具有适当的权限600和user1:usergroup;当我访问sub.domain.

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

当我访问domain.com而不首先访问sub.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为会话创建不同的文件,或使它们可以从两个域访问

附言。 正如我出于某种奇怪的原因所说的,这种情况只发生在IE上,来自PHP的错误消息是: 未捕获的PHP错误:session_start()[function.session start]:打开(/tmp/sess_t1…,O_RDWR)失败:第46行的xxx.PHP文件中的权限被拒绝(13) 第46行是session_start()


感谢您在这方面的任何建议。

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

看看文档

请记住,您必须在初始化会话之前进行设置。

理想情况下,这应该是脚本首先要做的事情之一。

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

看看文档

请记住,您必须在初始化会话之前进行设置。

理想情况下,这应该是您的脚本首先要做的事情之一。

您确定IE会触发此问题吗

浏览器不能直接访问会话文件,只有PHP(HTTPD)进程可以访问会话文件

我不明白为什么一个浏览器应该在PHP日志中给出与另一个不同的错误消息


我认为您可能正在处理两个不同的问题。

您确定IE引发了这个问题吗

浏览器不能直接访问会话文件,只有PHP(HTTPD)进程可以访问会话文件

我不明白为什么一个浏览器应该在PHP日志中给出与另一个不同的错误消息


我认为您可能正在处理两个不同的问题。

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

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

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

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

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

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

我刚才遇到了同样的问题。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时发生的情况:

  • 我访问mycompany.com,会话文件在用户拥有的
    mycompanycom
    中创建
  • 然后我访问support.mycompany.com,第二个会话文件在用户所有的
    /tmp/
    中创建
  • Apache不会感到困惑,并且会返回正确的会话文件
  • 但是,以下是访问IE7和IE8时发生的情况:

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

    mkdir /tmp/mycompany
    chown nobody:nobody /tmp/mycompany
    
    php_value session.save_path '/tmp/mycompany'
    
    然后,我将以下内容添加到support.mycompany.com根web目录中的
    .htaccess
    文件中:

    mkdir /tmp/mycompany
    chown nobody:nobody /tmp/mycompany
    
    php_value session.save_path '/tmp/mycompany'
    
    最后,我删除了
    /tmp/
    中的所有现有会话数据,以确保新的会话路径立即得到使用:

    rm -f /tmp/sess_*
    
    就这样!现在IE7和IE8工作正常


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

    我也遇到了同样的问题。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时发生的情况:

  • 我访问mycompany.com,会话文件在用户拥有的
    mycompanycom
    中创建
  • 然后我访问support.mycompany.com,第二个会话文件在用户所有的
    /tmp/
    中创建
  • Apache一点也不困惑