我正在使用 Apache mod_rewrite,并希望根据 QUERY_STRING 中的域动态设置Host
标头。我该如何动态设置?RequestHeader
Host
给定以下请求 URL:
https://example.com/p12?url=http://nonssldomain.com/331551/1041505584.jpg?dt=032620151151
我尝试过的:
RewriteCond %{QUERY_STRING} ^url=(.*)$ [NC]
#some regex to parse domain from Query_String (Doesn't work)
RequestHeader set Host ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)
RewriteRule ^.*/p12$ %1? [P,NC,L]
我是否需要先动态设置一个变量?
答案1
您有以下声明:
RequestHeader set Host ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)
如果你看看RequestHeader
指令指出:
对于
set
、和append
,将给出一个值作为第三个参数。merge
add
因此,你的模式实际上被视为值。相反,你应该做的是
- 使用
<If>
指令查看您的请求是否p12?url=
- 使用子句
SetEnvIf
内的指令<if>
将一些自定义环境变量动态设置为您最后想要的值(我们假设它是my_new_host
:) - 添加
RequestHeader
以%{my_new_host}e
作为其第三个参数的语句。
请尝试以下操作:
<If "%{QUERY_STRING} =~ m#(?:https?://)?(?:[^@\n]+@)?(?:www\.)?(?<NEW_HOST>[^:/\n]+)#">
RequestHeader set Host %{MATCH_NEW_HOST}e
</If>
答案2
解决方案如下
此正则表达式使我们能够获取整个查询字符串以及主机的域。%1 获取整个查询参数,%2 获取域。正则表达式示例可在此处找到https://regex101.com/r/dC0xZ4/2
RewriteCond %{QUERY_STRING} url=((?:https?://)?(?:[^@\n]+@)?(?:www\.)?([^:/\n]+).*) [NC]
当我们看到 p12 时,如果重写条件为真,我们将代理 %1,并设置新的主机环境变量。
RewriteRule ^.*/p12$ %1 [P,NC,L,E=new_host:%2]
您需要检查 new_host 环境变量是否存在,否则您将主机设置为空。
<If "-T reqenv('new_host')">
//Set host with new_host variable
RequestHeader set Host %{new_host}e
</If>