mod_rewrite 后环境变量在服务器上不可用,但在本地工作

ins*_*ner 5 mod-rewrite .htaccess suexec server-side-includes apache-2.2

我正在一个站点上工作,在该站点上我使用 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>";
Run Code Online (Sandbox Code Playgroud)

相关线路来自 .htaccess

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ /$1.html [L]

RewriteRule ^my_tst$ /cgi-bin/my_tst.cgi [L]
Run Code Online (Sandbox Code Playgroud)

HTML文件:

 <!--#set var="HTTP_my_var" value="YES" -->
 <!--#include virtual="/cgi-bin/my_tst.cgi" -->
 <br>
 <!--#include virtual="/my_tst" -->
Run Code Online (Sandbox Code Playgroud)

这是我本地机器上的结果:

它在工作吗?是的

它在工作吗?是的

但是在生产服务器上:

它在工作吗?是的

它在工作吗?

比较服务器配置,唯一真正想到的是生产服务器httpd -M上没有列出 apreq_module (shared),本地服务器也没有列出 fcgid_module (shared)(等等)。可能是由于这些吗?是什么导致了这种奇怪的行为不匹配?

在情况下,它需要提的是,当我做的转储%ENV没有了的REDIRECT_ *变量出现在改写部生产服务器(第二include的HTML指令),而他们在本地服务器上做的,和非重写include 指令的输出。


编辑:添加另一个变量HTTP_my_var2通过SetEnv指令在 .htaccess 中设置,没有问题,即该值不会在重写中被丢弃。

但是,将变量设置为SetEnvIf确实会触发问题,


Edit1:已确认,似乎mod_suexec,mod_rewritemod_include(以及mod_setenvif)之间存在奇怪的交互作用。我通过在suexec启用的情况下运行它成功地在本地重现了该问题。通过注释掉条目中的SuexecUserGroupVirtualHost(并重新启动服务器)来禁用 suexec会产生所需的结果。现在调查可能的解决方案。

这实际上可能是 apache httpd 中的一个错误。

Rob*_*ton 0

据记录,Suexec 在运行 CGI 脚本之前清除环境

https://httpd.apache.org/docs/2.4/env.html

一些注意事项

...当使用suexec 启动CGI 脚本时,在启动CGI 脚本之前,环境将被清理为一组安全变量。安全变量列表是在编译时在 suexec.c 中定义的。