我见过其他示例,其中人们捕获并使用参数作为重写路径的一部分
是的,这是可能的。基本原理是一样的:
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]