使用htaccess查询字符串重定向

Tom*_*man 3 .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
Run Code Online (Sandbox Code Playgroud)

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

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

Laz*_*One 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]
Run Code Online (Sandbox Code Playgroud)

例如:

  1. 它将重定向http://www.example.com/hello.php?id=86&name=John&ref=12d34888&me=yes到相同的URL,但ref仅使用参数:http://www.example.com/hello.php?ref=12d34888.

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


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

RewriteRule ^$ http://%{HTTP_HOST}/?ref=%2 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

(如果放在网站根文件夹中的.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]
Run Code Online (Sandbox Code Playgroud)

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