Apache 可以根据 URL 重写请求的 Host 标头吗?

Apache 可以根据 URL 重写请求的 Host 标头吗?

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 很容易,但我还没有找到使用从 URL 中提取的值来修改 Host 标头的方法。这可能吗?

答案1

是的,您可以根据 URI 更改标头。不过这很丑陋 —— 这是我所知道的唯一方法:

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

  2. 使用mod_headers'RequestHeader指令来重置适当的请求标头 ( Host:)(如果设置了该环境变量)。

答案2

使用上面提到的 SetEnvIf 和 Header,下面是我所做的,重写“Accept-Encoding”标头以减少 mod_cache 创建的缓存副本,测试有效。

# 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”与“gzip, deflate”(带有额外空格),这会导致 mod_cache 创建内容的不同副本。通过将其重写为相同的值,mod_cache 仅生成一个副本。(注意:我的服务器只关心“gzip,deflate”,您的服务器可能不同)。

相关内容