什么会导致PHP变量被服务器重写?

时间:2012-02-16 19:21:45

标签: php apache url-rewriting redhat

我的公司有一台虚拟机安装了网络软件。但是我遇到了一个相当离奇的问题,如果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 :(得分: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