Как создать рекурсивную замену в mod_rewrite? - PullRequest
1 голос
/ 07 апреля 2009

Я довольно новичок в mod_rewrite и пытаюсь конвертировать URL из

http://example.com/foo/bar/blah/etc.html

в

http://example.com/stuff/foo_bar_blah_etc.html

Предполагается, что между доменом и именем файла нет заданного числа каталогов, поэтому я не могу просто написать одно правило перезаписи с 3 заполнителями. Я мог бы создать 5 или 6 правил с заполнителями от 0 до 5, но у меня есть ощущение, что есть лучший способ. Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2009

Я думаю, вы могли бы сделать это, чтобы заменить одну косую черту за подчеркиванием:

RewriteRule ^/(.+)/(.*?)$ /$1_$2 [N]
RewriteRule ^.*$ /stuff$0

Флаг [N] заставляет Apache перезапустить процесс перезаписи URL из первого правила. Если у вас есть другие правила, которые применяются к URL до этих двух, помните, что они также будут вызываться на каждой итерации.

Альтернативой, которая может быть, а может и не быть более эффективной, было бы использование внешней программы для обработки перезаписи. Вы бы поместили это в свой конфигурационный файл Apache (вместо вышеуказанного)

RewriteMap slashtouscore prg:/usr/local/bin/slashtouscore.pl
RewriteRule ^/(.*)$ /stuff${slashtouscore:$1}

и тогда вам нужно будет создать исполняемый скрипт /usr/local/bin/slashtouscore.pl с содержимым

#!/usr/bin/perl
$| = 1;
while (<>) {
    s|/|_|g;
    print;
}

(Конечно, это не должен быть скрипт на Perl, подойдет любая программа с той же функцией - и, конечно, имя файла может быть любым, если оно доступно для Apache)

Обратите внимание, что ничего из этого не проверено.

1 голос
/ 08 апреля 2009

Попробуйте это:

RewriteRule (.*)/(.+) $1_$2 [NS]
RewriteRule (.*) stuff/$1 [NS]
...