2013-01-16 45 views
0

我们有不同的.htaccess重写规则,这看起来像:mod_rewrite:如何编写正确的规则以重定向从长URL到短URL?

RewriteEngine On 

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

我们需要为我们的一些重写规则,它会做一个301长的URL短网址重定向镜子改写条件。例如。

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

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

谢谢。

更新:我们已经尝试了很多不同的转义序列,但没有人可以为我们工作

+0

你有什么网址,你想要什么网址? – primetwig

+0

@SunnyTAR - 我想将/controllers/index.php?action=one|two的请求301重定向到/ view-one-2 –

+0

尝试将'/'放在'RewriteRule ^/controllers/index中。 ..' – primetwig

回答

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的参数,然后通过%,而不是通过$引用。 另外,请注意,要绕过查询字符串传递给结果规则,我们使用?在目标路径的末尾。

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