Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature(plugin): rewrite upstream info with plugin proxy-rewrite #594

Merged
merged 8 commits into from
Sep 27, 2019
1 change: 1 addition & 0 deletions conf/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ plugins: # plugin list
- serverless-pre-function
- serverless-post-function
- openid-connect
- proxy-rewrite
shuaijinchao marked this conversation as resolved.
Show resolved Hide resolved

stream_plugins:
- mqtt-proxy
72 changes: 72 additions & 0 deletions doc/plugins/proxy-rewrite-cn.md
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` 插件了。其他插件的开启和移除也是同样的方法。
73 changes: 73 additions & 0 deletions doc/plugins/proxy-rewrite.md
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.
77 changes: 77 additions & 0 deletions lua/apisix/plugins/proxy-rewrite.lua
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 = {
shuaijinchao marked this conversation as resolved.
Show resolved Hide resolved
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
1 change: 1 addition & 0 deletions t/APISIX.pm
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ _EOC_
listen 1980;
listen 1981;
listen 1982;
server_name apisix.iresty.com;

server_tokens off;

Expand Down
2 changes: 1 addition & 1 deletion t/admin/plugins.t
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ __DATA__
--- request
GET /apisix/admin/plugins/list
--- response_body_like eval
qr/\["limit-req","limit-count","limit-conn","key-auth","prometheus","node-status","jwt-auth","zipkin","ip-restriction","grpc-transcode","serverless-pre-function","serverless-post-function","openid-connect"\]/
qr/\["limit-req","limit-count","limit-conn","key-auth","prometheus","node-status","jwt-auth","zipkin","ip-restriction","grpc-transcode","serverless-pre-function","serverless-post-function","openid-connect","proxy-rewrite"\]/
--- no_error_log
[error]
1 change: 1 addition & 0 deletions t/debug-mode.t
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ loaded plugin and sort by priority: 3000 name: ip-restriction
loaded plugin and sort by priority: 2599 name: openid-connect
loaded plugin and sort by priority: 2510 name: jwt-auth
loaded plugin and sort by priority: 2500 name: key-auth
loaded plugin and sort by priority: 1008 name: proxy-rewrite
loaded plugin and sort by priority: 1003 name: limit-conn
loaded plugin and sort by priority: 1002 name: limit-count
loaded plugin and sort by priority: 1001 name: limit-req
Expand Down
6 changes: 6 additions & 0 deletions t/lib/server.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local json_decode = require("cjson").decode
local json_encode = require("cjson").encode

local _M = {}

Expand All @@ -22,6 +23,11 @@ function _M.limit_conn()
ngx.say("hello world")
end

function _M.plugin_proxy_rewrite()
ngx.say("uri: ", ngx.var.uri)
ngx.say("host: ", ngx.var.host)
ngx.say("scheme: ", ngx.var.scheme)
end

function _M.status()
ngx.say("ok")
Expand Down
Loading