[当我使用ngx.var.request_uri
时,我返回的字符串包含%20而不是空格。是否有urldecode()函数或类似函数可以解码我的字符串?
解码后的URI可以在ngx.var.uri
中找到。它不包含查询字符串,如果需要,请参见ngx.var.query_string
。
编辑:如果您不能使用它,这是在Lua中取消转义URL的简单方法。
local hex_to_char = function(x)
return string.char(tonumber(x, 16))
end
local unescape = function(url)
return url:gsub("%%(%x%x)", hex_to_char)
end
示例用法:
local url = "/test/some%20string?foo=bar"
print(unescape(url)) -- /test/some string?foo=bar
但是您可能应该使用它来拆分查询字符串之前。
LuaSocket具有url.unescape
实用程序。引用:
url.unescape
从字符串中删除URL转义内容编码。
内容是要解码的字符串。
该函数返回解码后的字符串。
尝试使用url.unescape(content)
中的ngx.req
API
nginx-lua-module
:重写uri,仅重写路径,如果u也要替换参数,请使用ngx.req.set_uri
ngx.req.set_uri_args
:用于编码字符串ngx.escape_uri
:用于解码字符串例如:解码路径和参数
ngx.unescape_uri
参考文件:location / {
.....
rewrite_by_lua_block {
# Get oring nginx var $uri,if u want , ucant change to $request_uri ,$args ...
local uri = ngx.var.uri
# use api below to decode args
ngx.req.set_uri_args(ngx.unescape_uri(ngx.var.args));
# use set_uri to decode path
ngx.req.set_uri(ngx.unescape_uri(uri));
}
}
proxy_pass ....;