с использованием 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?
У меня это работает со следующим:
#!/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
с
Вы пробовали, чтобы ваш Perl-скрипт возвращал правильный формат? Ожидается пара ключ / значение, то есть:
someval someothersite.com
Это может исправить ваши проблемы. Если нет, вы можете попробовать использовать текстовый файл для имитации того, что возвращает ваш Perl-скрипт, чтобы убедиться, что RewriteMap
вообще работает.