.htaccess仅在GET参数存在时重定向

时间:2015-03-06 16:30:39

标签: php apache .htaccess redirect url-rewriting

我有一个老客户的网站没有'漂亮'网址。所以目前它看起来像这样:

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

参数值仅为数字。

现在,他们希望将旧网站移动到子网域,而主(www)域将成为新网站(具有SEO友好URL的WP)的所在地。

现在我想做的是将所有来自/?w=<num>(仅限那些)的请求重定向到sub.domain.com/?w=<num>,以便将现有链接(主要来自Google)重定向到子域名页面,而新页面可以通过漂亮的网址提供新内容。

我试过了:

# 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 

我做错了什么?我搜索得很高,但总是得到这样的建议。或者我可能只是在搜索错误的关键字......

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

仅用于文档:如果要仅在存在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]

我确信这会对其他人有所帮助,因为我偶然发现了上面的问题,试图找到这个答案。