使用htaccess查询字符串重定向

时间:2011-08-09 17:14:32

标签: .htaccess mod-rewrite

在我正在处理的网站上,我需要设置一个需要考虑查询字符串的重定向。

示例:

http://www.domain.com/?id=86&name=John&ref=12d34 -> http://www.domain.com/?ref=12d34
http://www.domain.com/?ref=593x56&id=935 -> http://www.domain.com/?ref=593x56
http://www.domain.com/?ref=3v77l32 -> http://www.domain.com/?ref=3v77l32

所以基本上我需要找到ref参数及其值(无论它的长度如何),并仅将该部分附加到新URL。问题是ref参数可以出现在URL中的任何位置。

非常感谢任何帮助或指导!

2 个答案:

答案 0 :(得分:5)

RewriteRule无法直接使用查询字符串 - 您必须使用RewriteCond

以下是规则 - 它将重定向(301永久重定向)任何在查询字符串中包含多个参数的URL,其中1个为ref

RewriteEngine On

RewriteCond %{QUERY_STRING} (^|&)ref=([^&]*)(&|$)
RewriteCond %{QUERY_STRING} !^ref=([^&]*)$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}?ref=%2 [R=301,L]

例如:

  1. 它会将http://www.example.com/hello.php?id=86&name=John&ref=12d34888&me=yes重定向到同一网址,但仅限ref参数:http://www.example.com/hello.php?ref=12d34888

  2. 如果仅存在ref参数或根本没有参数,则无效,例如http://www.example.com/hello.php?ref=12d34888http://www.example.com/hello.php


  3. 如果此类重定向仅适用于网站根目录,请将RewriteRule行更改为:

    RewriteRule ^$ http://%{HTTP_HOST}/?ref=%2 [R=301,L]
    

    (如果放在网站根文件夹中的.htaccess文件中 - 如果置于服务器配置/虚拟主机上下文中,则需要稍微调整规则)。

    http://www.example.com/?id=86&name=John&ref=12d34888&me=yes - > http://www.example.com/?ref=12d34888


    如果必须将其重定向到另一个域,请按域名特定名称替换%{HTTP_HOST},例如:

    RewriteRule ^$ http://www.exampe.com/?ref=%2 [R=301,L]
    

    这一切都在发布前经过测试。

答案 1 :(得分:-1)

RewriteEngine On
RewriteRule ref=(.*?) /?ref=$1 [L]

就像猜测一样简单,但是如果ref查询变量不是行中的最后一件事,那么这将会搞砸 - 它会在{{1}之后淹没所有内容并将其重定向到,所以

ref=

会变成

/blah&ref=abc&blahblahblah