如何在mod_rewrite中创建递归替换?

时间:2009-04-07 19:57:19

标签: regex apache mod-rewrite url-rewriting

我是mod_rewrite的新手,我正在尝试从

转换网址
http://example.com/foo/bar/blah/etc.html

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

假设域和文件名之间没有一定数量的目录,因此我不能只用3个占位符编写单个重写规则。我可以想象创建5到6个规则,零到5个占位符但我觉得有更好的方法。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:4)

我认为你可以用一个下划线一次替换一个斜杠:

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 :(得分:1)

试试这个:

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