我不明白这种情况下 Apache2 的机制:
1/ 在此位置:var/www/cgi-bin/(用户组权限:www-数据)我有一个 CGI 脚本(php-cgi),它将执行 PHP 应用程序+VAR 环境版本:
#!/bin/bash
# file : var/www/cgi-bin/cgi-php
exec "/usr/bin/php-cgi$PHP_VERSION"
该脚本已:chmod a+x
由用户 www-data(Apache 服务器)在运行时执行
所有 PHP 版本位于:
/usr/bin/php-cgi5.6
/usr/bin/php-cgi7.0
/usr/bin/php-cgi7.1
/usr/bin/php-cgi7.2
所有版本均运行良好。
2/ 在 Apache Server .conf 文件中,我使用:
<Directory "/var/www/cgi-bin">
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
AllowOverride All
</Directory>
SetEnv PHP_VERSION 7.1
ScriptAlias /cgi-bin-php/ /var/www/cgi-bin/
Action php-cgi /cgi-bin-php/php-cgi
AddHandler php-cgi .php
当 Apache2 重新启动时,我可以在 http 中看到:PHP 版本7.1已加载(工作正常)。
3 / 如果我在 .htaccess 文件中放置另一个 PHP_VERSION 变量,它不会被发送吗?
文件:/var/www/html/.htaccess
SetEnv PHP_VERSION 5.6
在这种情况下,.htaccess 文件什么也不做。在 http 中我可以看到:PHP 版本 7.1
问题:为什么设置环境变量 PHP_VERSION XX在运行时正在工作(当我启动 Apache2 时)。
为什么我不能设置一个新变量(设置环境变量 PHP_VERSION XX) 来自 .htaccess 文件?我认为 Apache 不会将 $PHP_VERSION 变量发送到 shell 环境 (Ubuntu Server 16.04)。
如果有人能帮助我...非常感谢。
来源 :https://www.codejam.info/2014/08/apache-get-php-version-from-environment.html
答案1
我按照您提供的源链接中概述的步骤操作,经过一些小修改后,它就可以正常工作。首先,您需要确保将该.htaccess
文件放入的目录已配置好,以便AllowOverride
它能够正常工作,否则它只会默默失败。
其次,由于您正在将 PHP 作为 CGI 运行,如果您要删除 phpinfo 页面并检查正在设置的变量,您就会发现问题。假设您的文件已成功设置您的变量.htaccess
,它将以修改后的方式传递:
_SERVER["REDIRECT_PHP_VERSION"]
如果你只是修改/var/www/cgi-bin/cgi-php
文件来查找REDIRECT_PHP_VERSION
变量(如exec "/usr/bin/php-cgi$REDIRECT_PHP_VERSION"
),那么这可能会起作用。或者(根据此来源),如果您使用 fastcgi,则不必担心变量名称会发生变化。如果这些都不起作用,那么我会从 phpinfo 页面开始,查看传递了哪些变量(如果有的话),然后从那里开始。
编辑:只是注意到我的测试环境是在 CentOS 7 服务器上全新安装的 httpd,并使用 PHP 的 SCL 版本,并相应地修改路径。