在我正在处理的网站上,我需要设置一个需要考虑查询字符串的重定向。
示例:
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中的任何位置。
非常感谢任何帮助或指导!
答案 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]
例如:
它会将http://www.example.com/hello.php?id=86&name=John&ref=12d34888&me=yes
重定向到同一网址,但仅限ref
参数:http://www.example.com/hello.php?ref=12d34888
。
如果仅存在ref
参数或根本没有参数,则无效,例如http://www.example.com/hello.php?ref=12d34888
或http://www.example.com/hello.php
。
如果此类重定向仅适用于网站根目录,请将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