当用户请求http://sub1.example.com/a/b/c 时,我需要将此请求的主机名标头替换为 example.com 并将路径重写为http://example.com/sub1/a/b/丙。我尝试使用 reqrep,但找不到如何将子域部分添加到路径中。
reqirep ^Host:\ (.*[^\.])(\.example\.com) Host:\ example.com
reqrep ^([^\ :]*)\ (.*) \1\ /???/\2
Run Code Online (Sandbox Code Playgroud)
我找到了 %[req.hdr(host),lower,field(1,'.')] 方法来获取子域名,但我不能在 reqrep 方法的替换部分使用它。在这部分如何使用变量?
将子域捕获到一个名为的请求变量中req.rewrite_example
(这是我刚刚创建的名称......这req.
是必需的,其余的可以是你想要的任何东西)......通过捕获Host:
标头的值,将其转换为小写来做到这一点,然后使用regsub()
转换器擦洗.example.com
最后。仅当主机名以.example.com
--结尾时才执行此操作- 否则变量未定义,-m found
后续规则中的测试将为假,并且不会触发这些规则(这是我们想要的,对于我们可能会看到的任何其他域名)。
http-request set-var(req.rewrite_example) req.hdr(host),lower,regsub(\.example\.com$,) if { hdr_end(host) -i .example.com }
Run Code Online (Sandbox Code Playgroud)
如果定义了变量(如果第一条规则匹配,则应在路径的开头插入捕获的变量)。
http-request set-path /%[var(req.rewrite_example)]%[path] if { var(req.rewrite_example) -m found }
Run Code Online (Sandbox Code Playgroud)
如果定义了变量,则Host:
用文字字符串替换标题example.com
。
http-request set-header Host example.com if { var(req.rewrite_example) -m found }
Run Code Online (Sandbox Code Playgroud)
...发送请求...
curl http://www.example.com/tacgnol.jpg
Run Code Online (Sandbox Code Playgroud)
...并且以下标头正在发送到后端:
GET /www/tacgnol.jpg HTTP/1.1
User-Agent: curl/7.35.0
Accept: */*
Host: example.com
Run Code Online (Sandbox Code Playgroud)
完毕。
归档时间: |
|
查看次数: |
5198 次 |
最近记录: |