在Apache mod重写中dynamic设置RequestHeader主机

我正在使用Apache mod_rewrite,我正在寻找基于QUERY_STRING的域dynamic设置RequestHeaderHost头。 我将如何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指令,它说:

对于setappendmergeadd一个值作为第三个参数给出。

所以,你的模式实际上被视为价值。 相反,你应该做的是

  1. 使用<If>指令来查看您的请求是否为p12?url=
  2. <if>子句中使用SetEnvIf指令将一些自定义环境variablesdynamic地设置为最后所需的值(让我们假设它是: my_new_host
  3. 添加带有%{my_new_host}eRequestHeader语句作为第三个参数。

尝试以下操作:

 <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>