使用 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 脚本的人,我建议:
确保您拥有:
RewriteEngine On
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
在您的 httpd.conf 中,您可以看到 mod_rewrite 正在做什么
编写脚本,然后启动它(即
./my_script.pl
)并输入一些输入以确保获得预期结果。这就是我意识到我需要\n
's
答案2
您是否尝试过让 Perl 脚本返回正确的格式?它需要一个键/值对,即:
someval someothersite.com
这可能会解决您的问题。如果没有,您可以尝试使用 txt 文件来模拟 Perl 脚本返回的内容,以验证它是否RewriteMap
正常工作。