我公司给了一个虚拟机来安装网络软件.但是我遇到一个非常奇怪的问题,即如果
PHP变量与特定模式匹配,服务器将会覆盖(重写)PHP变量.什么可以重写这样的PHP变量?
以下是作为一个完整的独立脚本.
<?PHP $foo = 'b.domain.com'; echo $foo; // 'dev01.sandBox.b.domain.com' $bar = 'dev01.sandBox.domain.com'; echo $bar; // 'dev01.sandBox.sandBox.domain.com' $var = 'b.domainfoo.com'; echo $var; // 'b.domainfoo.com' (not overwritten because it didn't match whatever RegEx has been set) ?>
基本上任何包含域名和域名匹配的变量都将被重写.这不是mod_rewrite能够触摸的东西,所以它必须是在解析PHP并且重写字符串(如果它匹配RegEx)的服务器级别的东西.
使用mod_perl:PerlOutputFilterHandler可以在Apache中进行输出覆盖.
原文链接:https://www.f2er.com/php/132035.html可以将以下内容添加到apache.conf中以设置输出过滤器:
<FilesMatch "\.(html?|PHP|xml|css)$"> PerlSetVar Filter On PerlHandler MyApache2::FilterDomain PerlOutputFilterHandler MyApache2::FilterDomain </FilesMatch>
示例过滤器处理程序代码:
#file:MyApache2/FilterDomain.pm #-------------------------------- package MyApache2::FilterDomain; use strict; use warnings; use Apache2::Filter(); use Apache2::RequestRec(); use APR::Table(); use Apache2::Const -compile => qw(OK); use constant BUFF_LEN => 1024; sub handler { my $f = shift; my @hostname = split(/\./,$f->r->hostname); my $new_hostname = $hostname[0].".".$hostname[1]; unless ($f->ctx) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } while ($f->read(my $buffer,BUFF_LEN)) { $buffer =~ s/([a-z0-9]+)+\.domain\./$new_hostname\.$1.domain\./g; $f->print($buffer); } return Apache2::Const::OK; } 1;
更多关于Apache mod_perl过滤器可以在这里找到:mod_perl: Input and Output Filters