【发布时间】:2013-12-15 10:21:23
【问题描述】:
当我使用ngx.var.request_uri 时,我得到一个包含 %20 代替空格的字符串。是否有 urldecode() 函数或类似的函数来解码我的字符串?
【问题讨论】:
当我使用ngx.var.request_uri 时,我得到一个包含 %20 代替空格的字符串。是否有 urldecode() 函数或类似的函数来解码我的字符串?
【问题讨论】:
如果您使用的是nginx-lua-module ,那么您可以使用下面的 api。
newstr = ngx.unescape_uri(str)你也可以看看 ngxescape_uri
【讨论】:
解码后的 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
但您可能应该在使用它之前拆分查询字符串。
【讨论】:
error_page 404 /test 通过 404 弹回我时,当我访问 ngx.var.uri 时它等于 /test 而不是 /abc。但是,ngx.var.request_uri 的计算结果为 /abc
从nginx-lua-module尝试ngx.req api
ngx.req.set_uri : 重写 uri,只重写路径,如果你也想替换参数,使用ngx.req.set_uri_args
ngx.escape_uri: 用于编码字符串ngx.unescape_uri: 用于解码字符串例如:解码路径和参数
location / {
.....
rewrite_by_lua_block {
# Get nginx var $uri , 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 ....;
参考。文档:https://github.com/openresty/lua-nginx-module#ngxreqset_uri
【讨论】:
LuaSocket 有一个 url.unescape 实用程序。引用:
url.unescape(content)从字符串中移除 URL 转义内容编码。
内容是要解码的字符串。
函数返回解码后的字符串。
【讨论】: