【问题标题】:Using mod_rewrite to redirect based on query string parameter使用 mod_rewrite 根据查询字符串参数进行重定向
【发布时间】:2021-12-03 04:15:03
【问题描述】:

我正在尝试使用 mod_rewrite,但我不完全确定它是否可能。

假设我有一些请求,例如:

https://www.example.com?h=somerandomvalue&u=www.another.example/content

我想取u参数的值并用这个值重写请求,所以从上面的示例请求中,我想将它重写为

https://www.another.example/content

所以基本上,请求:

https://www.example.com?h=somerandomvalue&u=www.another.example/content

重定向到:

www.another.example/content

这可能吗?我已经看到其他示例,其中人们正在捕获和使用参数作为重写路径的一部分,但我没有看到任何使用提供的参数重定向到全新域的方式。

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

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite url-rewriting


    【解决方案1】:

    我见过其他示例,其中人们捕获并使用参数作为重写路径的一部分

    是的,这是可能的。基本原理是一样的:

    RewriteEngine On
    
    RewriteCond %{QUERY_STRING} (?:^|&)u=([\w./-]{6,})(?:&|$)
    RewriteRule ^$ https://%1 [QSD,R=302,L]
    

    %1 是对前面 CondPattern 中捕获组的反向引用。 IE。 u URL 参数的

    ([\w./-]{6,}) 只是一个非常基本的检查来匹配一个半有效的 URL。这可以改进。

    正则表达式上的(?:^|&) 前缀确保我们只匹配u URL 参数,而不匹配任何以u 结尾的URL 参数。

    这仅重定向对根的请求,如您的示例所示。恶意用户可能会将您的网站变成转发流量的中继站。

    但是,如果不进一步验证重定向到此的 URL,则可能会被滥用,不应使用。

    更新#1:

    例如,您可以使用一系列RewriteCond 指令来限制可以重定向到的主机名:

    RewriteCond %{QUERY_STRING} (?:^|&)u=([\w./-]{6,})(?:&|$)
    RewriteCond %1 ^(www\.another\.example/.*) [OR]
    RewriteCond %1 ^(www\.two\.example/.*) [OR]
    RewriteCond %1 ^(www\.three\.example/.*) [OR]
    RewriteCond %1 ^(www\.four\.example/specific/path/to/file.html)
    RewriteRule ^$ https://%1 [QSD,R=302,L]
    

    %1 反向引用(包含从上次匹配的CondPattern 中捕获的组)与u URL 参数中发送的完整 URL 匹配。这依赖于 RewriteCond 指令在满足条件时“提前”完成这一事实。

    如果您有许多特定的 URL,那么您可以在服务器配置中创建一个 RewriteMap 并执行查找以检查有效的 URL。

    或者,将请求重写为服务器端脚本(例如 PHP)并在脚本中管理检查和重定向。


    更新#2:

    如果 u 参数是编码的 URL,此示例是否也有效?

    目前没有。 QUERY_STRING 服务器变量未进行 % 解码。要允许 URL 编码 (%-encoded) 参数值,您需要在匹配 URL 的正则表达式字符类中包含 % 并在 RewriteRule 指令中包含 NE (noescape) 标志以防止任何 %-encoded 字符在重定向响应中被双重编码。

    例如:

    RewriteCond %{QUERY_STRING} (?:^|&)u=([\w%./-]{6,})(?:&|$)
    :
    RewriteRule ^$ https://%1 [NE,QSD,R=302,L]
    

    【讨论】:

    • 感谢您的帮助。你说得对,这在实践中很危险——简单地说,这应该重定向 1000 个不同的 URL,我在某些 RewriteCond 中无法解释所有这些。我会将您的答案标记为正确答案,因为它通常按描述的方式工作,但是请知道我已决定查看其他选项,以便您和我可以睡得更香。
    • 如果 u 参数是编码的 url,这个例子是否也有效?
    • @JasonWordtmann 目前没有。我已经用一个允许使用 % 编码 URL 参数的示例更新了我的答案。
    猜你喜欢
    • 2012-10-02
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2013-12-25
    相关资源
    最近更新 更多