我的.htaccess:
SetEnv tvar "my value"
RewriteEngine on
RewriteRule .* - [E=boostpath:normal]
我的虚拟主机设置:
AllowOverride All
Options FollowSymLinks
Require all granted
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/home/dir/public_html/www.site.com/$1
我的php文件:
<?php
putenv("foo=bar");
echo "<br><br>env";
echo getenv("foo"); #works, outputs bar
echo "<br><br>env2";
echo getenv("tvar"); #doesn't work, empty
echo getenv("REDIRECT_tvar"); #doesn't work, empty
echo "<br><br>";
echo "<br><br>env3";
echo getenv("boostpath"); #doesn't work, empty
echo getenv("REDIRECT_boostpath"); #doesn't work, empty
echo "<br><br>";
print_r($_ENV) 也是空的。但我尝试在 php.ini 中将variables_order = 'EGPCS' 改为 $_ENV,结果显示正确,但没有任何 .htaccess 设置变量,脚本的结果完全相同。需要此功能才能使网站能够在不同的目录中缓存移动和非移动查看器。
答案1
在您的 VirtualHost 指令中:
<Directory /home/dir/public_html/www.site.com>
AllowOverride All
Options FollowSymLinks
Require all granted
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$
RewriteCond %2 -f
RewriteRule . fcgi://127.0.0.1:9001/%1 [L,P]
RewriteOptions Inherit
</Directory>
网站速度很快,drupal 可以运行,其他文件可以运行,环境变量可以传递。不要使用 ProxyPass 或 ProxyPassMatch!!!!它不会传递环境变量并破坏一些 php 包。有人显示你可以使用 LocationMatch 和 Interpolation,但这似乎只适用于 ajp:// 而不是 fcgi:// !!!
不幸的是,这不会将用户设置为 php-fpm 池配置中设置的用户,而是设置为 apache 用户和组。不过这是另一个问题,所以我会将其标记为已解决。我必须将可写文件夹更改为 apache 用户和组,如果您仔细想想,这还算安全,但这也是不合逻辑的,并且存在一些奇怪的问题。