Apache可以根据URL重写请求的主机头?

Apache是​​我的应用程序的反向代理。 客户请求http://cdn.example.com/foo/images/logo.png

 GET /foo/images/logo.png HTTP/1.1 Host: cdn.example.com 

我希望Apache修改请求,以便反向代理另一端的应用程序以http://foo.example.com/images/logo.png格式接收它:

 GET /images/logo.png HTTP/1.1 Host: foo.example.com 

重写URL很容易,但我还没有find一个方法来修改主机头与从URL中提取的值。 这可能吗?

是的,您可以根据URI更改标题。 这很丑陋 – 这是我知道的唯一方法:

  1. 如果URI匹配您想要重写的内容,请使用SetEnvIF设置环境variables。

  2. 如果设置了该环境variables,则使用mod_headers的RequestHeader指令重置相应的请求标头( Host: :) 。

使用上面提到的SetEnvIf和Header,下面是我重写“Accept-Encoding”头文件,以减less由mod_cache创build的caching副本,这是经过testing的。

 # rewrite variation of the Accept-Encoding header to the same one # to reduce the caching copies UnsetEnv compression_ok SetEnvIfNoCase Accept-Encoding ".*gzip.*deflate.*" compression_ok=1 RequestHeader set Accept-Encoding "gzip,deflate" env=compression_ok 

这是做什么的:不同的浏览器设置Accept-Encoding的方式略有不同,比如“gzip,deflate”vs“gzip,deflate”(有额外的空间),这些都会导致mod_cache创build不同的内容副本。 通过将其重写为相同的值,mod_cache只会生成一个副本。 (注意:我的服务器只关心“gzip,deflate”,你的可能会不同)。