公司给我提供了一台虚拟机来安装 Web 软件。但我遇到了一个相当奇怪的问题,如果 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
通过使用 mod_perl,可以在 Apache 中覆盖输出: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;
有关 Apache mod_perl 过滤器的更多信息可以在这里找到:mod_perl:输入和输出过滤器