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