在 Apache mod rewrite 中动态设置 RequestHeader 主机

在 Apache mod rewrite 中动态设置 RequestHeader 主机

我正在使用 Apache mod_rewrite,并希望根据 QUERY_STRING 中的域动态设置Host标头。我该如何动态设置?RequestHeaderHost

给定以下请求 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,将给出一个值作为第三个参数。mergeadd

因此,你的模式实际上被视为值。相反,你应该做的是

  1. 使用<If>指令查看您的请求是否p12?url=
  2. 使用子句SetEnvIf内的指令<if>将一些自定义环境变量动态设置为您最后想要的值(我们假设它是my_new_host:)
  3. 添加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>

相关内容