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

मैं सर्वर पर प्रत्येक फ़ाइल पर "सैंडबॉक्स" खोजूंगा। –

+0

मैं पहले से ही/etc में sandbox के लिए grep-ed। –

+1

यदि आप इस मशीन को phpinfo() करते हैं, तो क्या आप कुछ सामान्य नहीं देखते हैं? –

उत्तर

5

mod_perl का उपयोग करके अपाचे के भीतर आउटपुट ओवरराइटिंग संभव है: PerlOutputFilterHandler।

निम्नलिखित उत्पादन फ़िल्टर सेट करने के लिए एक 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; 

अधिक अपाचे मोड-पर्ल फिल्टर पर यहां पाया जा सकता: mod_perl: Input and Output Filters

संबंधित मुद्दे