В настоящее время я использую 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, поэтому я ищу способ, которым их нельзя экранировать.