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

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

我正在开发一个网站,我使用 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_*变量在生产服务器中的重写部分(includeHTML 的第二条指令)中出现,而在本地服务器上以及包含指令的非重写输出中也出现。


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

但是,设置变量确实SetEnvIf会引发问题,


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

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

答案1

有记录显示 Suexec 在运行 CGI 脚本之前会清除环境

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

一些警告

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

相关内容