Назад | Перейти на главную страницу

переписать карту (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?

У меня это работает со следующим:

#!/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с

Вы пробовали, чтобы ваш Perl-скрипт возвращал правильный формат? Ожидается пара ключ / значение, то есть:

someval someothersite.com

Это может исправить ваши проблемы. Если нет, вы можете попробовать использовать текстовый файл для имитации того, что возвращает ваш Perl-скрипт, чтобы убедиться, что RewriteMap вообще работает.