2012-02-16 63 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

相關問題