mod_rewrite:如何编写正确的规则从长到短的URL重定向?

时间:2013-01-16 14:42:23

标签: mod-rewrite

我们在.htaccess中有不同的重写规则,如下所示:

RewriteEngine On

RewriteRule ^view-([_a-zA-Z]+)-([_a-zA-Z]+)$  /controllers/index.php?action=$1|$2

我们需要为我们的一些重写规则创建一个镜像重写条件,这将重定向从长URL到短URL。 E.g。

RewriteRule ^controllers/index\.php\?action=([_a-zA-Z]+)\|([_a-zA-Z]+)$  /view-$1-$2 [R=301]

但是,由于某种原因,这条规则不起作用。能帮助我们理解为什么吗?

谢谢。

更新:我们尝试了很多不同的转义序列,但似乎没有一个适用于我们

1 个答案:

答案 0 :(得分:0)

我们找到了解决方案。

首先,我们不太清楚mod_rewrite是如何工作的 - RewriteRule无法解析查询字符串。 为此,有必要添加重写条件,它将解析查询字符串,然后解析重写规则,该规则将使用已解析的查询字符串。

因此,为了解决我们的情况,我们需要以下内容:

RewriteCond %{QUERY_STRING}    ^action=([_a-zA-Z]+)\|([_a-zA-Z]+)$
RewriteRule ^controllers/index\.php$    /view-%1-%2?    [R=301,L]

注意,RewriteCond解析的参数然后通过%引用,而不是通过$引用。 另外,请注意,为了绕过将查询字符串传递给结果规则,我们正在使用?在目标路径的末尾。

现在唯一剩下的就是摆脱循环重定向,但这是不同的故事。