如何在Lua中url解码request_uri字符串

问题描述 投票:8回答:4

[当我使用ngx.var.request_uri时,我返回的字符串包含%20而不是空格。是否有urldecode()函数或类似函数可以解码我的字符串?

nginx lua
4个回答
10
投票

解码后的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

但是您可能应该使用它来拆分查询字符串之前


19
投票

如果您使用的是nginx-lua-module ,则可以为此使用以下api。

newstr = ngx.unescape_uri(str)

您也可以看一下ngxescape_uri


0
投票

LuaSocket具有url.unescape实用程序。引用:

url.unescape

从字符串中删除URL转义内容编码。

内容是要解码的字符串。

该函数返回解码后的字符串。


0
投票

尝试使用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 ....;

© www.soinside.com 2019 - 2024. All rights reserved.