使用 mod_rewrite 根据查询字符串参数重定向

Using mod_rewrite to redirect based on query string parameter

我正在尝试让一些东西与 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

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

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

I've seen other examples where people are capturing and using parameters as part of a rewritten path

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

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 的捕获组)匹配 [=14] 中发送的完整 URL =] URL 参数。这依赖于 RewriteCond 指令在满足条件时“提前”完成的事实。

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

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


更新#2:

Does this example also work if the u parameter is an encoded URL?

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

例如:

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