2012-02-16 9 views
10

Me dieron una máquina virtual en mi empresa para instalar el software web. Pero me encontré con un problema bastante extraño en el que las variables PHP se sobrescribían (reescribían) en el servidor si coincidían con un patrón específico. ¿Qué podría reescribir las variables de PHP como esta?¿Qué causaría que el servidor reescribiera las variables de PHP?

La siguiente es una secuencia de comandos completa independiente.

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

Esencialmente se reescribirá cualquier variable que contenga un subdominio y coincidencias en el nombre de dominio. Esto no es algo que mod_rewrite podría tocar, por lo que tiene que ser algo a nivel de servidor que analice PHP y reescriba una cadena si coincide con un RegEx.

+1

buscaría "sandbox" en cada archivo en el servidor. –

+0

Ya tengo grep-ed para sandbox en/etc. –

+1

Si usa phpinfo() esta máquina, ¿ve algo que no sea normal? –

Respuesta

5

La sobrescritura de salida es posible dentro de Apache utilizando mod_perl: PerlOutputFilterHandler.

El siguiente podría añadirse a un apache.conf para ajustar el filtro de salida:

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

Ejemplo código de controlador de filtro:

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

Más en filtros mod_perl Apache se puede encontrar aquí: mod_perl: Input and Output Filters

Cuestiones relacionadas