Существует ли Lua-эквивалент функции javascript encodeURI()?

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

Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
0
0
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

возможно этот вопрос поможет вам

Кроме того, быстрым решением было бы заменить «%2F» на «/».

newUrl = oldUrl:gsub("%2F", "/")

Эй, спасибо за ответ. Поскольку следующие символы ; / ? : @ & = + $ , # являются символами, которые могут быть частью синтаксиса URI, поэтому я ищу способ, которым их нельзя экранировать.

dhruvparekh12 26.03.2024 13:12
Ответ принят как подходящий

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 помогла. Спасибо!

dhruvparekh12 27.03.2024 04:34

Другие вопросы по теме