【问题标题】:How do I create a recursive replacement in mod_rewrite?如何在 mod_rewrite 中创建递归替换?
【发布时间】:2009-04-08 04:54:18
【问题描述】:

我对 mod_rewrite 还很陌生,我正在尝试将 URL 从

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

进入

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

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

【问题讨论】:

    标签: regex apache mod-rewrite url-rewriting


    【解决方案1】:

    我认为您可以这样做以用下划线一次替换一个斜杠:

    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 访问)

    请注意,这些都没有经过测试。

    【讨论】:

    • 感谢您的详尽回答。
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 感谢您的快速回复。一旦我有机会测试它,我会接受你的答案。
    • 我最初发布的内容恐怕不起作用。我已将其编辑为测试显示更实用的内容。
    • 我认为您的意思是使用 [N] 作为第一行的标志。
    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2011-09-08
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多