仅当GET参数存在时,.htaccess才会redirect

我有一个没有“漂亮”url的旧网站的客户端。 所以目前看起来像这样:

http://www.domain.com/?w=42&a=5&b=3 

参数值只是数字。

现在他们希望将旧网站移动到一个子域名和主(www)域名将回家一个新的网站(WP与SEO友好的url)。

现在我想要做的是将所有来自/?w=<num> (仅限于那些)的请求redirectsub.domain.com/?w=<num> ,以便现有链接(主要来自Google)被redirect到子域名页面,而新的页面通过非常漂亮的URL来提供新的内容。

我试过这个:

 # This works, but redirects the entire www.domain.com # to sub.domain.com no mather what RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC] RewriteRule ^(.*)$ http://sub.domain.com/$1 [R=301,L] # But this DOESN'T work RewriteRule ^/?w(.*) http://sub.domain.com/?w$1 [R=301,L] # Also tried to redirect 'by hand', but DIDN'T work either Redirect 301 /?w=42 http://sub.domain.com/?w=42 

我究竟做错了什么? 我search了高低,但总是以这种build议结束。 或者,也许我只是在寻找错误的关键字…

谢谢!

您无法匹配重写规则或重定向指令中的查询字符串。 您需要匹配%{QUERY_STRING}变量。 尝试:

 RewriteCond %{QUERY_STRING} (^|&)w=[0-9]+(&|$) RewriteRule ^(.*)$ http://sub.domain.com/$1 [L,R=301] 

请注意,查询字符串会自动附加到规则目标的末尾。

仅供文档使用:如果只要存在URL参数(从一个路径到另一个路径),而您想要重定向一个目录(路径),则可以在维护URL参数的同时在htaccess文件中使用此参数:

 # /programs/?id=1 to new path /loadprog/?id=1 RewriteCond %{REQUEST_URI} ^/programs/ RewriteCond %{QUERY_STRING} id= RewriteRule ^programs\/$ /loadprog/$1 [R=301,L] 

我相信这会帮助别人,因为我偶然发现上面的问题试图找到这个答案。