【问题标题】:Query string redirection with htaccess使用 htaccess 查询字符串重定向
【发布时间】:2011-08-09 17:14:31
【问题描述】:

在我现在正在开发的网站上,我需要设置一个重定向,将查询字符串考虑在内。

例子:

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 中的任何位置。

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

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    RewriteRule 不能直接与查询字符串一起使用——您必须为此使用RewriteCond

    这是规则——它将重定向(301 永久重定向)任何在查询字符串中具有超过 1 个参数且其中 1 个为 ref 的 URL

    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 重定向到相同的 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]
    

    (如果放置在网站根文件夹中的 .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]
    

    发帖前都已经测试过了。

    【讨论】:

    • 哇!非常感谢您的详细解释。测试完我会再次发表评论。
    • 它就像我需要的那样工作。谢谢 LazyOne Kenobi。你是我唯一的希望。
    【解决方案2】:
    RewriteEngine On
    RewriteRule ref=(.*?) /?ref=$1 [L]
    

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

    /blah&ref=abc&blahblahblah
    

    会变成

    /ref=abc&blahblahblah
    

    【讨论】:

    • 非常感谢马克!尽管有警告,我确实可以使用它。如果我想获得确切的值而不是 ref 参数之后的所有内容,您能否指出我正确的方向?
    • 非常感谢,我会试一试。
    • RewriteRule 不能直接使用查询字符串参数
    • 谢谢 LazyOne,你建议我改用什么?
    • @Tom 查看我的回答。 @Mark 您提供的模式不安全,因为如果参数名称末尾有ref,它也可以工作,例如myref?myref=12345&id=56789 - 这里没有ref 参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多