重写地图(prg:) 永远不会完成

重写地图(prg:) 永远不会完成

使用 Apache 和 prg 类型重写映射。我的映射如下所示:

#!/usr/bin/perl
$| = 1; # Turn off buffering 
while (<STDIN>) {
    print "someothersite.com";
}

httpd.conf中声明的重写规则是:

RewriteMap app_map prg:/file/path/test.pl
RewriteRule  (\/[\w]+)(\/[^\#\s]+)?$ http://${app_map:$1}$2 [P,L]

日志文件显示:

init rewrite engine with requested uri /a/testlink.html
applying pattern '(\/[\w]+)(\/[^\#\s]+)?$' to uri '/a/testlink.html'

看起来 test.pl 从未将控制权交还给 apache,当成功找到地图时,我希望在日志文件中看到以下输出:

map lookup OK: map=app_map key=/a -> val=someothersite.com

为什么我的地图没有将控制权交还给 Apache?

答案1

我使用以下方法使其工作:

#!/usr/bin/perl
#
##   disable buffered I/O which would lead
##   to deadloops for the Apache server
$| = 1;
#
##   read URLs one per line from stdin
while (<>) {
    my $line = $_;
    if ($line eq "input_from_apache\n"){
        print "my_desired_output\n";    
    }   
    else{
        print "\n";
    }
}

据我所知,我缺少的是换行符。对于任何试图调试 RewriteMap 脚本的人,我建议:

  1. 确保您拥有:

    RewriteEngine On

    RewriteLog /var/log/httpd/rewrite.log

    RewriteLogLevel 9

    在您的 httpd.conf 中,您可以看到 mod_rewrite 正在做什么

  2. 编写脚本,然后启动它(即./my_script.pl)并输入一些输入以确保获得预期结果。这就是我意识到我需要\n's

答案2

您是否尝试过让 Perl 脚本返回正确的格式?它需要一个键/值对,即:

someval someothersite.com

这可能会解决您的问题。如果没有,您可以尝试使用 txt 文件来模拟 Perl 脚本返回的内容,以验证它是否RewriteMap正常工作。

相关内容