2012-02-16 22 views
10

Tôi đã được cấp một máy ảo tại công ty của mình để cài đặt phần mềm web. Nhưng tôi đi qua một vấn đề khá kỳ lạ, nơi các biến PHP sẽ được ghi đè (viết lại) bởi máy chủ nếu chúng khớp với một mẫu cụ thể. Điều gì có thể viết lại các biến PHP như thế này?Điều gì sẽ khiến các biến PHP được máy chủ viết lại?

Sau đây là toàn bộ tập lệnh độc lập.

<?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) 
?> 

Thực chất bất kỳ biến nào chứa tên miền phụ và kết quả trùng khớp trên tên miền sẽ được viết lại. Đây không phải là một cái gì đó mod_rewrite sẽ có thể liên lạc, do đó, nó phải được một cái gì đó ở cấp độ máy chủ được phân tích ra PHP và viết lại một chuỗi nếu nó phù hợp với một RegEx.

+1

tôi sẽ tìm kiếm "sandbox" trên mọi tệp trên máy chủ. –

+0

Tôi grep-ed cho sandbox trong/etc rồi. –

+1

Nếu bạn phpinfo() máy này, bạn có thấy một cái gì đó không bình thường? –

Trả lời

5

Ghi đè đầu ra có thể trong Apache bằng cách sử dụng mod_perl: PerlOutputFilterHandler.

Sau đây có thể được thêm vào một apache.conf để thiết lập các bộ lọc đầu ra:

<FilesMatch "\.(html?|php|xml|css)$"> 
    PerlSetVar Filter On 
    PerlHandler MyApache2::FilterDomain 
    PerlOutputFilterHandler MyApache2::FilterDomain 
</FilesMatch> 

Ví dụ mã xử lý lọc:

#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; 

Thông tin thêm về bộ lọc mod_perl Apache có thể được tìm thấy ở đây: mod_perl: Input and Output Filters

Các vấn đề liên quan