配置rewrite

本章介绍如何配置HTTP rewrite。该功能对收到的HTTP请求消息进行修改,再转发到后端服务。

开启rewrite

在conf/bfe.conf中,打开该模块

Modules = mod_write

模块配置

模块配置在目录conf/mod_rewrite/中,包含两个文件:

$ ls
mod_rewrite.conf	rewrite.data

mod_rewrite.conf为模块基础配置文件,指向rewrite规则文件,通常无需修改。

$ cat mod_rewrite.conf 
[basic]
DataPath = mod_rewrite/rewrite.data

rewrite.data 包含rewrite规则,可动态加载。安装包中的示例配置文件如下:

$ cat rewrite.data 
{
    "Version": "1",
    "Config": {
        "example_product": [
            {
                "Cond": "req_path_prefix_in(\"/rewrite\", false)",
                "Actions": [
                    {
                        "Cmd": "PATH_PREFIX_ADD",
                        "Params": [
                            "/bfe/"
                        ]
                    }
                ],
                "Last": true
            }
        ]
    }
}

上述配置为产品线example_product中增加了一个规则:对满足条件"Cond"的请求,执行"Actions"动作(包含动作名"Cmd"和对应的参数),如果"Last"为true,停止执行后续动作,否则继续匹配下一条规则。

最终,该规则将修改Path为/rewrite开头的请求,为其增加路径前缀/bfe/,也就是将Path从/rewrite变为/bfe/rewrite。

重写动作

"Actions"中的"Cmd"指示了具体的重写动作。

HOST_SET

设置请求header中的Host值,参数为需设置的值。

示例:

{
    "Cmd": "HOST_SET", 
    "Params": ["www.example.com"]
}

结果: | | | |-|-| |原始值 | http://abc.example.com | |修改后 | http://www.example.com |


HOST_SET_FROM_PATH_PREFIX

将Path中的第一段设置为Host的值,并在Path中去掉该段。例如:如果Path为/x.example.com/xxxx,设置Host为 x.example.com,PATH为/xxxx。

示例:

{
    "cmd": "HOST_SET_FROM_PATH_PREFIX", 
    "params": []
}

结果: | | | |-|-| |原始值 | http://www.example.com/test.example.com/xxxx | |修改后 | http://test.example.com/xxxx |


HOST_SUFFIX_REPLACE

替换域名中的特定后缀。两个参数分别为被替换的后缀字符串和替换后的字符串。

示例:

{
    "cmd": "HOST_SUFFIX_REPLACE", 
    "params": ["net", "com"]
}

结果: | | | |-|-| |原始值 | http://www.example.net | |修改后 | http://www.example.com |


PATH_SET

设置Path为指定值,参数为的新Path值。

示例:

{
    "cmd": "PATH_SET", 
    "params": ["/index"]
}

结果: | | | |-|-| |原始值 | http://www.example.com/current | |修改后 | http://www.example.com/index |


PATH_PREFIX_ADD

为Path增加前缀,参数为需增加的前缀。

示例:

{
    "cmd": "PATH_PREFIX_ADD", 
    "params": ["/index"]
}

结果: | | | |-|-| |原始值 | http://www.example.com/current | |修改后 | http://www.example.com/index/current |


PATH_PREFIX_TRIM

删除Path前缀,参数为需删除的前缀。

示例:

{
    "cmd": "PATH_PREFIX_TRIM", 
    "params": ["/service"]
}

结果: | | | |-|-| |原始值 | http://www.example.com/service/index.html | |修改后 | http://www.example.com/index.html |


QUERY_ADD

增加Query,参数指定需增加的query的key和value。

示例:

{
    "cmd": "QUERY_ADD", 
    "params": ["name", "alice"]
}

结果: | | | |-|-| |原始值 | http://www.example.com/ | |修改后 | http://www.example.com/?name=alice |


QUERY_RENAME

对Query重命名,参数指定key的原名字和新名字。

示例:

{
    "cmd": "QUERY_ADD", 
    "params": ["name", "user"]
}

结果: | | | |-|-| |原始值 | http://www.example.com/?name=alice | |修改后 | http://www.example.com/?user=alice |


QUERY_DEL

删除指定Query,参数指定key的名字。

示例:

{
    "cmd": "QUERY_ADD", 
    "params": ["name"]
}

结果: | | | |-|-| |原始值 | http://www.example.com/?name=alice | |修改后 | http://www.example.com/ |


QUERY_DEL_ALL_EXCEPT

删除Query中指定key外所有其他key。

示例:

{
    "cmd": "QUERY_DEL_ALL_EXCEPT", 
    "params": ["name"]
}

结果: | | | |-|-| |原始值 | http://www.example.com/?name=alice?key1=value2&key2=value2 | |修改后 | http://www.example.com/?name=alice |