2012-02-16 65 views
10

我被授予了我公司的虚拟机来安装网络软件。但是我遇到了一个相当奇怪的问题,如果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匹配的字符串。

+1

我会搜索服务器上每个文件的“沙箱”。 – 2012-02-16 19:27:59

+0

我已经在/ etc中为沙箱进行了grep-ed。 – 2012-02-16 19:29:55

+1

如果你phpinfo()这台机器,你看到一些不正常的东西? – 2012-02-16 19:32:45

回答

5

使用mod_perl:PerlOutputFilterHandler可以在Apache中输出覆盖。

以下可以被添加到一个的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

相关问题