O que faria com que as variáveis do PHP fossem reescritas pelo servidor?

1

Recebi uma VM na minha empresa para instalar o software da web. Mas me deparei com um problema bastante bizarro em que as variáveis do PHP seriam sobrescritas (reescritas) pelo servidor se elas correspondessem a um padrão específico. O que poderia reescrever variáveis PHP assim?

O seguinte é como todo um script autônomo.

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

Essencialmente, qualquer variável que contenha um subdomínio e corresponde ao nome do domínio seria reescrita. Isso não é algo que o mod_rewrite seria capaz de tocar, então tem que ser algo no nível do servidor que está analisando o PHP e reescrevendo uma string se ela corresponder a um RegEx.

    
por Highway of Life 16.02.2012 / 04:25

1 resposta

1

A sobregravação de saída é possível dentro do Apache usando mod_perl: PerlOutputFilterHandler .

O seguinte pode ser adicionado a um apache.conf para definir o filtro de saída:

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

Exemplo de código do manipulador 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;

Mais sobre os filtros mod_perl do Apache podem ser encontrados aqui: mod_perl: Filtros de entrada e saída

    
por 20.03.2012 / 20:58