問題描述
原配置
server{
listen 80;
rewrite /test/(.*) /dev/$1 last;
location ^~/dev{
access_by_lua_file '/opt/lua/bin/ap.lua';
proxy_pass http://192.168.143.28:80;
}
- 期望實(shí)現(xiàn)內(nèi)容:把請(qǐng)求過來的 /test 替換成 /dev ,并路由到下發(fā)攔截location檩帐,通過ap.lua腳本把替換后的url請(qǐng)求到一個(gè)代理服務(wù)串塑,代理服務(wù)進(jìn)行一些過濾后轉(zhuǎn)發(fā)后下方 proxy_pass.
- 實(shí)際結(jié)果:把請(qǐng)求過來的 /test 替換成 /dev 案站,并路由到下發(fā)攔截location,可是通過ap.lua 中的ngx.var.request_uri 取到的還是原來的/test予弧。
排查步驟
1.查看nginx文檔:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
last:rewrite后重新用更改后的url 匹配下location。與我們已命中 /dev 的現(xiàn)象想吻合湖饱。但是命中l(wèi)ua腳本后掖蛤,ngx.var.request_uri 取到的還是原地址。
2.查看資料:
得知應(yīng)用 ngx.var.uri獲取rewrite后的uri井厌,但不懈怠uri中的參數(shù)蚓庭。需自己拼接
更改后腳本
local rewriteUri = ngx.var.uri
local httpUri = ngx.var.request_uri
ngx.log(ngx.INFO, 'ngx.var.request_uri '..rawUri..'\nngx.var.uri:'..rewriteUri)
local equal_pos,_ = string.find(rawUri,rewriteUri)
-- rewrite過
if equal_pos == nil or equal_pos ~= 1 then
ngx.log(ngx.INFO, 'already rewrite!')
httpUri=rewriteUri
-- 獲取uri中攜帶的參數(shù)
local params_pos, _ = string.find(rawUri, '?')
if params_pos ~= nil and params_pos > 0 then
local params = string.sub(rawUri,params_pos)
httpUri = rewriteUri..params
end
end
ngx.log(ngx.INFO, 'httpUri '..httpUri)
查看資料:
https://www.cnblogs.com/mikeluwen/p/7116967.html
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html