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_rewrite和mod_include(以及mod_setenvif)之间存在奇怪的交互作用。我通过在suexec启用的情况下运行它成功地在本地重现了该问题。通过注释掉条目中的SuexecUserGroup行VirtualHost(并重新启动服务器)来禁用 suexec会产生所需的结果。现在调查可能的解决方案。
这实际上可能是 apache httpd 中的一个错误。
据记录,Suexec 在运行 CGI 脚本之前清除环境
https://httpd.apache.org/docs/2.4/env.html
一些注意事项
...当使用suexec 启动CGI 脚本时,在启动CGI 脚本之前,环境将被清理为一组安全变量。安全变量列表是在编译时在 suexec.c 中定义的。
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |