В настоящее время я использую openresty nginx для проксирования запросов к источнику. Я хочу избежать любых небезопасных символов в URI запроса.
По сути, я ищу Lua-эквивалент функции javascript encodeURI().
Есть ли в Lua метод, аналогичный encodeURI() в JS?
Я посмотрел ngx.escape_uri, но эта функция экранирует только компонент URI.
Я хочу, чтобы URI /test/[hello] стал /test/%5Bhello%5D после кодирования URI.
Если я сделаю encodeURI("/test/[hello]/"); в JS, я получу желаемый результат /test/%5Bhello%5D.
Но в Lua, если я это сделаю ngx.escape_uri("/test/[hello]/"), я получу результат как «%2Ftest%2F%5Bhello%5D».

возможно этот вопрос поможет вам
Кроме того, быстрым решением было бы заменить «%2F» на «/».
newUrl = oldUrl:gsub("%2F", "/")
ngx.escape_uri имеет возможность экранировать полный URI:
синтаксис: newstr = ngx.escape_uri(str, type?)
Начиная с версии 0.10.16, эта функция принимает необязательный аргумент типа. Он принимает следующие значения (по умолчанию 2):
0: экранирует str как полный URI. [...]
2: escape str как компонент URI. [...]
Тем не менее, ngx.escape_uri(str, 0) всё равно не то же самое, что encodeURI.
К счастью, легко написать собственную функцию, которая будет выдавать точно такой же результат, как encodeURI:
local function _encode_uri_char(char)
return string.format('%%%0X', string.byte(char))
end
local function encode_uri(uri)
return (string.gsub(uri, "[^%a%d%-_%.!~%*'%(%);/%?:@&=%+%$,#]", _encode_uri_char))
end
-- prints /test/%5Bhello%5D/
ngx.say(encode_uri('/test/[hello]/'))
Функция encode_uri экранирует все символы, кроме:
A–Z a–z 0–9 - _ . ! ~ * ' ( )
; / ? : @ & = + $ , #
как описано здесь.
Эта encode_uri реализация в Lua помогла. Спасибо!
Эй, спасибо за ответ. Поскольку следующие символы
; / ? : @ & = + $ , #являются символами, которые могут быть частью синтаксиса URI, поэтому я ищу способ, которым их нельзя экранировать.