理解 Nginx+OpenResty 中行内 Lua 代码中字符串的引用
2017-5-22 17:41:49
收藏:0
阅读:90
评论:1
为了进行测试,在一个带 OpenResty 的 Nginx 服务器中创建一些虚假数据。我需要创建一个数组,其中一个 IP 地址被复制,例如:
["1.2.3.4", "1.2.3.4", ...]
在 Ruby 中,实现可能类似于这样:
"[" + (["\"1.2.3.4\""] * 4096).join(", ") + "]"
我是 Lua 的初学者,在 OpenResty 环境中我苦苦挣扎,直到终于让它工作为止。这是最终的工作方式:
content_by_lua '
-- ... 一些代码 ...
local ips = {}
for i=1,4096 do ips[i] = "\\"1.2.3.4\\"" end
local fakeData = table.concat(ips, ", ")
local fakeResponse = "[" .. fakeData .. "]"
--- ...
'
我在字符串引用方面遇到了一些问题。首先,我尝试使用 '"1.2.3.4"',但在行内 Lua 段中不起作用。这是可以理解的,因为 ' 字符已经是 content_by_lua 段的分隔符。
接下来,我尝试使用 "\"1.2.3.4\"",我本来期望它能够起作用,但它导致了这个(令人困惑的)错误:
failed to load inlined Lua code:
content_by_lua(nginx.conf:235):17: malformed number near '1.2.3.4'
通过尝试和错误,我发现如果使用双引号("\\"1.2.3.4\\"")则这个错误会消失。虽然在相同的代码被拒绝在 Lua REPL 中时,但它在 OpenResty 中可行。
$ rep.lua
Lua REPL 0.8
> "\\"1.2.3.4\\""
[string "REPL"]:1: unexpected symbol near '"\"'
为了帮助我理解和成为一个更好的 Lua/OpenResty 程序员,我有一些关于引用的问题:
- 为什么需要双引号(在 OpenResty 中)?(为什么是
"\\"1.2.3.4\\""而不是"\"1.2.3.4\""?) - 为什么 OpenResty 的行为与 Lua REPL 不同?
- 是否可以在
content_by_lua段中使用单引号?(为了将其简化为'"1.2.3.4"')
(还有一个无关的问题困扰着我。有没有更简单的方法来表达这个代码?当我将它与我的 Ruby 片段进行比较时,我相当确定它也可以在 Lua 中更优雅地表达。)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

正如Egor所说的那样,这是因为nginx配置文件解析器在被Lua解析之前会剥离反斜杠字符
\。在你的情况下,"\\"1.2.3.4\\""是正确的,因为它被nginx配置解析器解析为"\"1.2.3.4\"",然后被Lua解析为字符串"1.2.3.4"。如果你不想担心使用多少反斜杠,有几种可行的替代方案。最简单的方法是使用从OpenResty v0.9.17开始提供的
content_by_lua_block。content_by_lua_block { -- ...一些代码... local ips = {} for i=1,4096 do ips[i] = '"1.2.3.4"' end local fakeData = table.concat(ips, ", ") local fakeResponse = "[" .. fakeData .. "]" --- ... }如果你的OpenResty版本无法使用Lua块,你可以使用Lua的多行字符串语法。
content_by_lua ' -- ...一些代码... local ips = {} for i=1,4096 do ips[i] = [["1.2.3.4"]] end local fakeData = table.concat(ips, ", ") local fakeResponse = "[" .. fakeData .. "]" --- ... '更多细节,请参见OpenResty文档。
另外,如果你想完全避免使用表格,你可以使用
string.rep制作相同的测试数据。content_by_lua ' -- ...一些代码... local ip = [["1.2.3.4"]] local fakeResponse = "[" .. string.rep(ip .. ", ", 4095) .. ip .. "]" --- ... '