да, спасибо за внимание и поддержку! удивительно, но на старом сервере действительно NJS младше: 0.4.0 хотя ставятся из одного докерфайла (и сегодня я даже пересобирал контейнер)
мы также пришли к выводу, что пара переменных точно будет похожа (к тому же править частично — это странная практика) в итоге нашлось решение без NJS использовать $uri как unescaped-форму и вот такую конструкцию для получения исходной формы: map $request_uri $escaped_uri { "~^(?P<path>[^?]*)(\?.*)?$" $path; } в итоге… мы поизучали свои данные и вообще это всё выкинули, оставив $uri — нечего баловать пользователей ;-) > On 1 Sep 2020, at 20:51, Dmitry Volyntsev <xei...@nginx.com> wrote: > > > On 01.09.2020 08:59, Alexey Galygin wrote: >> nginx из официального докер образа 1.18.0 >> njs шла в комплекте и отдельно не ставилась — 0.4.2 >> вообще никак не вмешивались… >> >> за альтернативу кода спасибо! >> сейчас думаем, как бы аккуратно выпилить эти артефакты совсем >> >> > Спасибо за баг-репорт. Могу подтвердить что проблема в NJS и появилась в > версии 0.4.2 (вероятно обновилась вместе деплоем нового образа?). > > Удалось воспроизвести проблему самостоятельно. Она действительно оказалась > связана с регулярными выражениями, а точнее с глобальным реплейсом > replace(/_/g, "%5F"). При определенных условиях код мог уходить в > endless-loop при этом поглощая всю доступную память. Исправленная версия > приедет в 0.4.4. > > Уточнее касательно исходных сниппетов: > > function unescapeURI(r) { return r.uri.replace(/%20/g, ' '); } > > r.uri уже возвращает unescaped версию URI, и replace(/%20/g, ' ') вернет > исходный URI. > Как результат $uri $unescaped_uri должны быть идентичными. > >>> On 1 Sep 2020, at 07:56, Dmitry Volyntsev <xei...@nginx.com> wrote: >>> >>> >>> On 01.09.2020 00:42, Alexey Galygin wrote: >>>> но на всякий случай, может есть версия как-то это нативно переписать для >>>> конфига без всяких языков и модулей? >>>> какие есть рекомендации? (совсем выкидывать всё же стрёмно…) >>> А подскажите свою версию njs (Если njs ставился из официальных пакетов, >>> будет доступен бинарник njs, и тогда версию можно узнать так `njs -v`). >>> >>>> оказалось проблема в NJS части, какой-то баг там именно в связке 1.18.0 + >>>> Ubuntu 20.04 >>> менялась ли версия njs при апгрейде? Если нет, единственное что пока >>> приходит на ум это изменения в версии libpcre между дистрибутивами. >>> >>> Как воркараунд можно попробовать переписать эти функции без использования >>> глобальных регулярок (наиболее вероятное место проблемы). >>> >>> function unescapeURI(r) { >>> return r.uri.replace(/%20/g, " "); >>> } >>> >>> -> >>> >>> 1) >>> // идентична по поведению исходной функции >>> function unescapeURI(r) { >>> return r.uri.split(/%20/).join(" "); >>> } >>> >>> 2) >>> // более стандартный метод, но заменит все %-encoded комбинации >>> https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/decodeURI >>> function unescapeURI(r) { >>> return decodeURI(r.uri); >>> } >>> >>> >>> function escapeURI(r) { >>> return r.uri.replace(/\s/g, "%20").replace(/_/g, "%5F"); >>> } >>> >>> -> >>> >>> 1) >>> // идентична по поведению исходной функции >>> function escapeURI(r) { >>> return r.uri.split(" ").join("%20").split("_").join("%5F"); >>> } >>> >>> 2) >>> // более стандартный метод, но заменит все %-encoded комбинации >>> https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/encodeURI >>> function escapeURI(r) { >>> return encodeURI(r.uri); >>> } >>> _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru