簡體   English   中英

什么會導致PHP變量被服務器重寫?

[英]What would cause PHP variables to be rewritten by the server?

我在公司獲得了一台虛擬機來安裝網絡軟件。 但是我遇到了一個相當離奇的問題,如果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。

使用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:輸入和輸出過濾器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM