Htaccess重写单个查询字符串

时间:2013-03-11 10:47:32

标签: string .htaccess mod-rewrite

我遇到了一个相当老的问题。我有一些带有查询字符串的通用URL,我想要301重定向,但我不想重新引导网址。我想选择每个查询字符串被重定向的位置,因为站点中有很多不同的类别。例如:

我想改变:

index.php?_a=viewCat&catId=199

为:

/garden-furniture/patio-furniture/garden-benches-garden-seats/cat_199.html 

但是生病想把另一个catid换成我选择的另一个URL,完全不同的结构。我遇到的问题是我得到的代码,如果我没有?在目标网址的末尾,它可以工作,但是将查询字符串追加到最后,如果我把它放在最后,它根本不会重定向。

我正在使用的代码:

RewriteCond %{QUERY_STRING} ^_a=viewCat&catId=199 
RewriteRule ^index\.php$  /garden-furniture/patio-furniture/garden-benches-garden-seats/cat_199.html? [L,R=301]

任何帮助将不胜感激!

编辑:我的其余部分

RewriteEngine On
RewriteRule ^conservatory/(.*)$ /conservatory-furniture/$1 [R=301,L]
RewriteRule ^dining-room/(.*)$ /dining-room-furniture/$1 [R=301,L]
RewriteRule ^garden/(.*)$ /garden-furniture/patio-furniture/$1 [R=301,L]



RewriteBase /
RewriteCond %{QUERY_STRING} (.*)$
 RewriteRule cat_([0-9]+)(\.[a-z]{3,4})?(.*)$   index.php?_a=viewCat&catId=$1&%1 [NC]

RewriteCond %{QUERY_STRING} (.*)$
RewriteRule prod_([0-9]+)(\.[a-z]{3,4})?$   index.php?_a=viewProd&productId=$1&%1 [NC]

RewriteCond %{QUERY_STRING} (.*)$
RewriteRule info_([0-9]+)(\.[a-z]{3,4})?$   index.php?_a=viewDoc&docId=$1&%1 [NC]

RewriteCond %{QUERY_STRING} (.*)$
RewriteRule tell_([0-9]+)(\.[a-z]{3,4})?$   index.php?_a=tellafriend&productId=$1&%1 [NC]

RewriteCond %{QUERY_STRING} (.*)$
RewriteRule _saleItems(\.[a-z]+)?(\?.*)?$   index.php?_a=viewCat&catId=saleItems&%1 [NC,L]

1 个答案:

答案 0 :(得分:0)

如果这些是完整的网址,您可以将模式锚定在字符串的开头

RewriteRule ^cat_([0-9]+)(\.[a-z]{3,4})?(.*)$   index.php?_a=viewCat&catId=$1&%1 [NC]

这会阻止将cat_内部的网址重写为index.php?...

由于你没有使用尾随可选部分,你也可以消除这个

RewriteRule ^cat_([0-9]+) index.php?_a=viewCat&catId=$1&%1 [NC]

另一点是带有查询字符串的RewriteCond。如果查询字符串是可选的,您可以删除RewriteCond并将RewriteRule修改为

RewriteRule ^cat_([0-9]+) index.php?_a=viewCat&catId=$1 [QSA,NC]

所以,所有这些都会成为

RewriteRule ^cat_([0-9]+) index.php?_a=viewCat&catId=$1 [QSA,NC]
RewriteRule ^prod_([0-9]+) index.php?_a=viewProd&productId=$1 [QSA,NC]
RewriteRule ^info_([0-9]+) index.php?_a=viewDoc&docId=$1 [QSA,NC]
RewriteRule ^tell_([0-9]+) index.php?_a=tellafriend&productId=$1 [QSA,NC]
RewriteRule ^_saleItems index.php?_a=viewCat&catId=saleItems [QSA,NC,L]