我正在使用SSI在一个网站上工作,在HTML页面上设置一个variables,然后在mod_rewrite重写之后,该variables将被脚本拾取。 这工作在我的本地设置,但由于某种原因,它不在生产服务器(都是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" -->
这是我的本地机器上的结果:
它在工作吗? 是
它在工作吗? 是
但是在生产服务器上:
它在工作吗? 是
它在工作吗? 没有
比较服务器configuration唯一真正想到的是在生产服务器httpd -M不列出apreq_module (shared) ,并且本地服务器不列出fcgid_module (shared) (等等)。 难道这是由于这些吗? 什么可能导致这种奇怪的行为不匹配?
如果需要提及的是,当我执行%ENV转储时, REDIRECT_ *variables在重写部分(HTML的第二个include指令)中不会显示在生产服务器中,而在本地服务器上执行时, include指令的非重写输出。
编辑:添加另一个variables,通过SetEnv指令在.htaccess中设置的HTTP_my_var2没有问题,即在重写中不显示该值。
但是,使用SetEnvIf设置variables会触发问题,
编辑1:确认,似乎mod_suexec , mod_rewrite和mod_include (以及mod_setenvif )之间有一个奇怪的交互。 我通过启用suexec成功地在本地重现问题。 通过注销VirtualHost条目中的SuexecUserGroup行来禁用suexec(并重新启动服务器)会产生所需的结果。 现在调查可能的解决scheme。
这可能实际上是Apache httpd中的一个错误。