【问题标题】:how to urldecode a request_uri string in Lua如何在 Lua 中对 request_uri 字符串进行 urldecode
【发布时间】:2013-12-15 10:21:23
【问题描述】:

当我使用ngx.var.request_uri 时,我得到一个包含 %20 代替空格的字符串。是否有 urldecode() 函数或类似的函数来解码我的字符串?

【问题讨论】:

    标签: nginx lua


    【解决方案1】:

    如果您使用的是nginx-lua-module ,那么您可以使用下面的 api。

    newstr = ngx.unescape_uri(str)

    你也可以看看 ngxescape_uri

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 当我访问 /abc 并且我的配置使用 error_page 404 /test 通过 404 弹回我时,当我访问 ngx.var.uri 时它等于 /test 而不是 /abc。但是,ngx.var.request_uri 的计算结果为 /abc
      • 好的,我已经编辑了我的答案,为您提供了另一个选项,它实际上在 Lua 中取消了 URL 的转义。
      • 我希望有办法做到这一点。
      【解决方案3】:

      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

      【讨论】:

        【解决方案4】:

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

        url.unescape(content)

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

        内容是要解码的字符串。

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

        【讨论】:

          猜你喜欢
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          • 2018-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-31
          • 1970-01-01
          相关资源
          最近更新 更多