VirtualHost 中的自定义 PHPINIDir 设置影响其他 VirtualHosts

Ale*_*x G 4 freebsd php apache-2.2

其中一位客户要求为他的网站进行个人 php.ini 配置,因此我将他的 VirtualHost 设置如下:

<VirtualHost *:80>
    DocumentRoot "/home/alex/www.domain.tld"
    ServerName www.domain.tld
    AssignUserID alex alex
    PHPINIDir /home/alex/php.ini
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

客户端在 /home/alex/ 下创建了 php.ini 文件,其中仅包含以下设置:

session.save_path = "/home/alex/.php_sessions/"

完成此操作后,他开始抱怨他看到了其他客户网站生成的所有其他会话文件。

在做了一些基本的故障排除后,我意识到他的 php.ini 设置影响了 httpd-vhosts.conf 中指定的所有网站。

问题是为什么?由于PHPINIDir仅在一个特定的VirtualHost?

Der*_*rfK 5

单个虚拟主机不能拥有自己的虚拟主机,PHPINIDir因为php.ini在 apache+mod_php 启动时读取文件,甚至在它开始处理请求之前。无论出于何种原因,该指令不会对此用法发出警告,而是设置全局 INI 目录并继续其愉快的方式。

相反,你必须使用php_valuephp_flagphp_admin_valuephp_admin_flagApache指令覆盖所需的特定设置该虚拟主机。(见这里)在这种情况下,你会这样做:

<VirtualHost *:80>
    DocumentRoot "/home/alex/www.domain.tld"
    ServerName www.domain.tld
    AssignUserID alex alex
    php_value session.save_path "/home/alex/.php_sessions/"
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它将加载默认php.ini文件,然后更改session.save_path到给定目录,仅用于此虚拟主机。