-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feature(plugin): rewrite upstream info with plugin
proxy-rewrite
(#594
- Loading branch information
1 parent
0d36723
commit 25fd698
Showing
9 changed files
with
469 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
[English](proxy-rewrite.md) | ||
# proxy-rewrite | ||
|
||
上游代理信息重写插件。 | ||
|
||
#### 配置参数 | ||
|名字 |可选|说明| | ||
|------- |-----|------| | ||
|scheme |可选| 转发到上游的新`schema` 协议,可以是`http`或`https`,默认`http`协议| | ||
|uri |可选| 转发到上游的新`uri` 地址| | ||
|host |可选| 转发到上游的新`host` 地址,例如:`iresty.com` | | ||
|enable_websocket|可选| 是否启用`websocket`(布尔值),默认不启用| | ||
|
||
### 示例 | ||
|
||
#### 开启插件 | ||
下面是一个示例,在指定的 route 上开启了 `proxy rewrite` 插件: | ||
|
||
```shell | ||
curl http://127.0.0.1:9080/apisix/admin/routes/1 -X PUT -d ' | ||
{ | ||
"methods": ["GET"], | ||
"uri": "/test/index.html", | ||
"plugins": { | ||
"proxy-rewrite": { | ||
"uri": "/test/home.html", | ||
"scheme": "http", | ||
"host": "iresty.com", | ||
"enable_websocket": true | ||
} | ||
}, | ||
"upstream": { | ||
"type": "roundrobin", | ||
"nodes": { | ||
"127.0.0.1:80": 1 | ||
} | ||
} | ||
}' | ||
``` | ||
|
||
#### 测试插件 | ||
基于上述配置进行测试: | ||
```shell | ||
curl -X GET http://127.0.0.1:9080/test/index.html | ||
``` | ||
|
||
发送请求,查看上游服务`access.log`,如果输出信息与配置一致: | ||
``` | ||
127.0.0.1 - [26/Sep/2019:10:52:20 +0800] iresty.com GET /test/home.html HTTP/1.1 200 38 - curl/7.29.0 - 0.000 199 107 | ||
``` | ||
|
||
即表示 `proxy rewrite` 插件生效了。 | ||
|
||
#### 禁用插件 | ||
当你想去掉 `proxy rewrite` 插件的时候,很简单,在插件的配置中把对应的 json 配置删除即可,无须重启服务,即刻生效: | ||
|
||
```shell | ||
curl http://127.0.0.1:9080/apisix/admin/routes/1 -X PUT -d ' | ||
{ | ||
"methods": ["GET"], | ||
"uri": "/test/index.html", | ||
"plugins": {}, | ||
"upstream": { | ||
"type": "roundrobin", | ||
"nodes": { | ||
"127.0.0.1:80": 1 | ||
} | ||
} | ||
}' | ||
``` | ||
|
||
现在就已经移除了 `proxy rewrite` 插件了。其他插件的开启和移除也是同样的方法。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
[中文](proxy-rewrite-cn.md) | ||
# proxy-rewrite | ||
|
||
upstream proxy info rewrite plugin. | ||
|
||
### Parameters | ||
|Name |Required|Description| | ||
|------- |-----|------| | ||
|scheme |No| Upstream new `schema` forwarding protocol,options can be `http` or `https`,default `http`.| | ||
|uri |No| Upstream new `uri` forwarding address.| | ||
|host |No| Upstream new `host` forwarding address, example `iresty.com`. | | ||
|enable_websocket|No| enable `websocket`(boolean), default `false`.| | ||
|
||
### Example | ||
|
||
#### Enable Plugin | ||
Here's an example, enable the `proxy rewrite` plugin on the specified route: | ||
|
||
```shell | ||
curl http://127.0.0.1:9080/apisix/admin/routes/1 -X PUT -d ' | ||
{ | ||
"methods": ["GET"], | ||
"uri": "/test/index.html", | ||
"plugins": { | ||
"proxy-rewrite": { | ||
"uri": "/test/home.html", | ||
"scheme": "http", | ||
"host": "iresty.com", | ||
"enable_websocket": true | ||
} | ||
}, | ||
"upstream": { | ||
"type": "roundrobin", | ||
"nodes": { | ||
"127.0.0.1:80": 1 | ||
} | ||
} | ||
}' | ||
``` | ||
|
||
#### Test Plugin | ||
Testing based on the above examples : | ||
```shell | ||
curl -X GET http://127.0.0.1:9080/test/index.html | ||
``` | ||
|
||
Send the request and see upstream `access.log', if the output information is consistent with the configuration : | ||
``` | ||
127.0.0.1 - [26/Sep/2019:10:52:20 +0800] iresty.com GET /test/home.html HTTP/1.1 200 38 - curl/7.29.0 - 0.000 199 107 | ||
``` | ||
|
||
This means that the `proxy rewrite` plugin is in effect. | ||
|
||
#### Disable Plugin | ||
When you want to disable the `proxy rewrite` plugin, it is very simple, | ||
you can delete the corresponding json configuration in the plugin configuration, | ||
no need to restart the service, it will take effect immediately : | ||
```shell | ||
curl http://127.0.0.1:9080/apisix/admin/routes/1 -X PUT -d ' | ||
{ | ||
"methods": ["GET"], | ||
"uri": "/test/index.html", | ||
"plugins": {}, | ||
"upstream": { | ||
"type": "roundrobin", | ||
"nodes": { | ||
"127.0.0.1:80": 1 | ||
} | ||
} | ||
}' | ||
``` | ||
|
||
The `proxy rewrite` plugin has been disabled now. It works for other plugins. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
local core = require("apisix.core") | ||
local plugin_name = "proxy-rewrite" | ||
local pairs = pairs | ||
local ipairs = ipairs | ||
|
||
local schema = { | ||
type = "object", | ||
properties = { | ||
uri = { | ||
description = "new uri for upstream", | ||
type = "string", | ||
minLength = 1, | ||
maxLength = 4096 | ||
}, | ||
host = { | ||
description = "new host for upstream", | ||
type = "string", | ||
pattern = "^\\*?[0-9a-zA-Z-.]+$", | ||
}, | ||
scheme = { | ||
description = "new scheme for upstream", | ||
type = "string", | ||
enum = {"http", "https"} | ||
}, | ||
enable_websocket = { | ||
description = "enable websocket for request", | ||
type = "boolean", | ||
default = false | ||
} | ||
}, | ||
minProperties = 1, | ||
} | ||
|
||
local _M = { | ||
version = 0.1, | ||
priority = 1008, | ||
name = plugin_name, | ||
schema = schema, | ||
} | ||
|
||
function _M.check_schema(conf) | ||
local ok, err = core.schema.check(schema, conf) | ||
if not ok then | ||
return false, err | ||
end | ||
return true | ||
end | ||
|
||
do | ||
local upstream_vars = { | ||
uri = "upstream_uri", | ||
scheme = "upstream_scheme", | ||
host = "upstream_host", | ||
upgrade = "upstream_upgrade", | ||
connection = "upstream_connection", | ||
} | ||
local upstream_names = {} | ||
for name, _ in pairs(upstream_vars) do | ||
core.table.insert(upstream_names, name) | ||
end | ||
|
||
function _M.rewrite(conf, ctx) | ||
for _, name in ipairs(upstream_names) do | ||
if conf[name] then | ||
ctx.var[upstream_vars[name]] = conf[name] | ||
end | ||
end | ||
|
||
if conf.enable_websocket then | ||
ctx.var["upstream_upgrade"] = ctx.var["http_upgrade"] | ||
ctx.var["upstream_connection"] = ctx.var["http_connection"] | ||
end | ||
end | ||
|
||
end -- do | ||
|
||
return _M |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -154,6 +154,7 @@ _EOC_ | |
listen 1980; | ||
listen 1981; | ||
listen 1982; | ||
server_name apisix.iresty.com; | ||
server_tokens off; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.