我正在使用Apache mod_rewrite,我正在寻找基于QUERY_STRING的域dynamic设置RequestHeader的Host头。 我将如何dynamic设置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]
我需要dynamic设置一个variables吗?
你有以下陈述:
RequestHeader set Host ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)
如果你看一下RequestHeader指令,它说:
对于
set,append,merge和add一个值作为第三个参数给出。
所以,你的模式实际上被视为价值。 相反,你应该做的是
<If>指令来查看您的请求是否为p12?url= <if>子句中使用SetEnvIf指令将一些自定义环境variablesdynamic地设置为最后所需的值(让我们假设它是: my_new_host ) %{my_new_host}e的RequestHeader语句作为第三个参数。 尝试以下操作:
<If "%{QUERY_STRING} =~ m#(?:https?://)?(?:[^@\n]+@)?(?:www\.)?(?<NEW_HOST>[^:/\n]+)#"> RequestHeader set Host %{MATCH_NEW_HOST}e </If>
解决办法如下
这个正则expression式使我们能够获取整个查询string以及主机的域名。 %1得到我们整个查询参数,%2得到我们只是域。 正则expression式的例子可以在这里findhttps://regex101.com/r/dC0xZ4/2
RewriteCond %{QUERY_STRING} url=((?:https?://)?(?:[^@\n]+@)?(?:www\.)?([^:/\n]+).*) [NC]
当我们看到p12时,如果重写条件为真,则代理%1,并设置新的主机envvariables。
RewriteRule ^.*/p12$ %1 [P,NC,L,E=new_host:%2]
您需要检查new_host envvariables是否存在,否则将您的主机设置为null。
<If "-T reqenv('new_host')"> //Set host with new_host variable RequestHeader set Host %{new_host}e </If>