【问题标题】:mod_rewrite: how to write a correct rule to redirect from long to short URL?mod_rewrite:如何编写正确的规则来从长 URL 重定向到短 URL?
【发布时间】:2013-01-16 14:42:23
【问题描述】:

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

RewriteEngine On

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

我们需要为我们的一些重写规则创建一个镜像重写条件,这将执行从长 URL 到短 URL 的 301 重定向。例如

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

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

谢谢。

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

【问题讨论】:

  • 你有什么网址,你想要什么网址?
  • @SunnyTAR - 我希望到达 /controllers/index.php?action=one|two 的请求被 301 重定向到 /view-one-two
  • 尝试将/ 放入RewriteRule ^/controllers/index...
  • @SunnyTAG:我们已经尝试过了 - 不起作用

标签: mod-rewrite


【解决方案1】:

我们找到了解决办法。

首先,我们不太了解 mod_rewrite 的工作原理 - RewriteRule 无法解析查询字符串。 为此,需要添加一个重写条件,它会解析查询字符串,然后是重写规则,它将使用解析的查询字符串。

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

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

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

现在唯一剩下的就是摆脱循环重定向,但那是另一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2011-10-07
    • 2020-12-20
    相关资源
    最近更新 更多