我在公司获得了一台虚拟机来安装networking软件。 但是,我遇到了一个奇怪的问题,如果PHPvariables匹配特定模式,它将被服务器覆盖(重写)。 什么可以重写这样的PHPvariables?
以下是一个完整的独立脚本。
<?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) ?>
基本上任何包含一个子域名和匹配域名的variables都会被重写。 这不是mod_rewrite能够触及的东西,所以它必须是在parsing出PHP的服务器级别的东西,并重写一个string,如果它匹配正则expression式。
通过使用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:输入和输出过滤器