我正在开发一个网站,我使用 SSI 在 HTML 页面上设置一个变量,该变量会被解析,然后脚本会在重写后获取该变量mod_rewrite
。这在我的本地设置上有效,但出于某种原因,它在生产服务器上不起作用(两者都是 apache 2.2.22)。以下是相关部分:
剧本perl
:
my $working = ($ENV{'HTTP_my_var'} || $ENV{'REDIRECT_HTTP_my_var'}) || "NO";
print "Content-type: text/html\n\n";
print "is it working? <b>$working</b>";
相关线路来自.htaccess
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ /$1.html [L]
RewriteRule ^my_tst$ /cgi-bin/my_tst.cgi [L]
HTML 文件:
<!--#set var="HTTP_my_var" value="YES" -->
<!--#include virtual="/cgi-bin/my_tst.cgi" -->
<br>
<!--#include virtual="/my_tst" -->
这是我本地机器上的结果:
它在工作吗?是的
它在工作吗?是的
但在生产服务器上:
它在工作吗?是的
它在工作吗?不
比较服务器配置时,唯一能想到的是生产服务器httpd -M
没有列出 apreq_module (shared)
,本地服务器也没有列出 fcgid_module (shared)
(等等)。可能是由于这些原因吗?是什么导致了这种奇怪的行为不匹配?
如果需要提及,当我转储%ENV
,没有任何的REDIRECT_*变量在生产服务器中的重写部分(include
HTML 的第二条指令)中出现,而在本地服务器上以及包含指令的非重写输出中也出现。
编辑:添加另一个变量,HTTP_my_var2它是通过指令在 .htaccess 中设置的SetEnv
,没有问题,即该值在重写中不会被破坏。
但是,设置变量确实SetEnvIf
会引发问题,
编辑 1:确认,似乎和(以及)之间存在奇怪的交互。我已通过在启用的情况下运行它成功地在本地重现了该问题mod_suexec
。通过注释掉条目中的行(并重新启动服务器)来禁用 suexec 会产生所需的结果。现在研究可能的解决方案。mod_rewrite
mod_include
mod_setenvif
suexec
SuexecUserGroup
VirtualHost
这实际上可能是 apache httpd 中的一个错误。
答案1
有记录显示 Suexec 在运行 CGI 脚本之前会清除环境
https://httpd.apache.org/docs/2.4/env.html
一些警告
... 当使用 suexec 启动 CGI 脚本时,在启动 CGI 脚本之前,环境将被清理为一组安全变量。安全变量列表在编译时在 suexec.c 中定义。