我是靠谱客的博主 爱撒娇毛豆,最近开发中收集的这篇文章主要介绍APISIX源码解析-插件-代理重写-【proxy-rewrite】proxy-rewrite 代理重写,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
proxy-rewrite 代理重写
关键属性
源码实现
do
local upstream_vars = {
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
-- 设置var变量
ctx.var[upstream_vars[name]] = conf[name]
end
end
if conf["scheme"] then
-- 设置上下文变量 schema: http / https
ctx.upstream_scheme = conf["scheme"]
end
local upstream_uri = ctx.var.uri
if conf.uri ~= nil then
-- 对uri进行变量替换,可以是自定义也可以是ngx内置变量$
upstream_uri = core.utils.resolve_var(conf.uri, ctx.var)
elseif conf.regex_uri ~= nil then
-- 正则匹配
local uri, _, err = re_sub(ctx.var.uri, conf.regex_uri[1],
conf.regex_uri[2], "jo")
if uri then
upstream_uri = uri
else
local msg = "failed to substitute the uri " .. ctx.var.uri ..
" (" .. conf.regex_uri[1] .. ") with " ..
conf.regex_uri[2] .. " : " .. err
core.log.error(msg)
return 500, {message = msg}
end
end
local index = str_find(upstream_uri, "?")
-- URL encode
if index then
upstream_uri = core.utils.uri_safe_encode(sub_str(upstream_uri, 1, index-1)) ..
sub_str(upstream_uri, index)
else
upstream_uri = core.utils.uri_safe_encode(upstream_uri)
end
-- 拼接query参数
if ctx.var.is_args == "?" then
if index then
ctx.var.upstream_uri = upstream_uri .. "&" .. (ctx.var.args or "")
else
ctx.var.upstream_uri = upstream_uri .. "?" .. (ctx.var.args or "")
end
else
ctx.var.upstream_uri = upstream_uri
end
if not conf.headers then
return
end
-- reform header from object into array, so can avoid use pairs,
-- which is NYI
-- 设置转发上游的请求头
if not conf.headers_arr then
conf.headers_arr = {}
for field, value in pairs(conf.headers) do
core.table.insert_tail(conf.headers_arr, field, value)
end
end
local field_cnt = #conf.headers_arr
for i = 1, field_cnt, 2 do
ngx.req.set_header(conf.headers_arr[i],
core.utils.resolve_var(conf.headers_arr[i+1], ctx.var))
end
end
end -- do
最后
以上就是爱撒娇毛豆为你收集整理的APISIX源码解析-插件-代理重写-【proxy-rewrite】proxy-rewrite 代理重写的全部内容,希望文章能够帮你解决APISIX源码解析-插件-代理重写-【proxy-rewrite】proxy-rewrite 代理重写所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复