Apache rewriteRule 配合url 添加proxy header

  1. 1. 问题描述
  2. 2. 解决方法
    1. 2.1. RequestHeader 和 Header 的区别?
    2. 2.2. ProxyPreserveHost 是什么意思?
  3. 3. 如何根据条件设置RequestHeader?

问题描述

我们有类似 get /index.php -> https://backend.example.com/index.php 的需求。但是apache的DNS服务器并不知道backend。只知道它ip地址。所以我们这个时候需要添加Host header来访问backend。

`curl -H”backend.example.com” backend_ip_address/index.php”

那么配置该如何写呢?

解决方法

思路是使用RequestHeader添加host的header。然后使用RewriteRule来forword这个request。

1
2
3
RequestHeader set Host backend.example.com
ProxyPreserveHost On
RewriteRule ^\/index.php$ https://backend.example.com/index.php [p]

RequestHeader 和 Header 的区别?

RequestHeader 顾名思义是添加Request的header。 而Header是添加response的header。

ProxyPreserveHost 是什么意思?

我们修改了RequestHeader,但是默认这个RequestHeader 不会传给proxy。我们需要保持我们修改后的header然后传给backend.example.com

如何根据条件设置RequestHeader?

有时候,我们除了get /index.php需要forword,其他都是参考本地的静态文件,这个时候就不需要修改RequestHeader。所以我们需要根据条件判断是否添加header。
最简单的方法是使用apache的环境变量。

1
2
3
4
SetEnvIf REQUEST_URI "^\/index.php$" BACKEND=1
RequestHeader set Host backend.example.com ENV=BACKEND
ProxyPreserveHost On ENV=BACKEND
RewriteRule ^\/index.php$ https://backend.example.com/index.php [p]

以上。

如果你觉得本文对你有帮助,请给我点赞助。