Рейтинг:1

Преобразовать переменную NGINX из верхнего регистра в нижний.

флаг co

Мне нужна небольшая помощь с настройкой nginx conf. Мой конфиг в основном такой...

карта $http_apikey $api_client_name {
    По умолчанию "";

    "CLIENT_ID" "client_one";
}

сервер {
  журнал_доступа /dev/stdout основной;

  слушать 443 ssl;
  имя_сервера локальный хост;

  # Конфигурация TLS
  ssl_certificate /etc/nginx/ssl/cert.pem;
  ssl_certificate_key /etc/nginx/ssl/key.pem;
  ssl_session_cache общий: SSL: 10 м;
  ssl_session_timeout 5 м;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_protocols TLSv1.2 TLSv1.3;

  proxy_intercept_errors включен; # Не отправлять ошибки бэкенда клиенту
  приложение по умолчанию_тип/json; # Если нет типа содержимого, то предположим, что это JSON

  расположение ~ ^/index-$http_apikey {
      если ($ http_apikey = "") {
          вернуть 401; # Неавторизованный
      }

      если ($api_client_name = "") {
          вернуть 403; # Запрещенный
      }

      proxy_pass http://elasticsearch:9200;
  }

....

Идея состоит в том, чтобы получить http_apikey из информации заголовка на POST и использовать ее как часть ссылки. Однако ВАР, http_apikey, содержит прописные буквы, а также строчные буквы и цифры. Ожидается, что URI будет в нижнем регистре, поэтому по существу:

  расположение ~ ^/index-$http_apikey.lower() {
      если ($ http_apikey = "") {
          вернуть 401; # Неавторизованный
      }

      если ($api_client_name = "") {
          вернуть 403; # Запрещенный
      }

      proxy_pass http://elasticsearch:9200;
  }

расположение ~ ^/index-$http_apikey.lower()

Есть ли способ сделать это в nginx? Как в Баше, я бы просто ${http_apikey,,} ... есть ли эквивалент nginx?

Спасибо

Gerard H. Pille avatar
флаг in
Что такое "ВАР"?
Рейтинг:1
флаг za

Краткая версия: нет, это невозможно.

Краткая, но оптимистичная версия: это невозможно при использовании только nginx, но возможно при использовании расширения lua. Или любое другое расширение nginx для языка программирования, например перл.

Длинная версия: значит, вы пытаетесь написать код внутри конфигурационных файлов nginx. Хотя конфигурация nginx предоставляет некоторые инструменты программирования (установка переменных, использование условных ветвей), его язык конфигурации не является кодом (основное различие между языком программирования и конфигурацией заключается в том, что операторы кода обрабатываются в том порядке, в котором они появляются, и Эффект операторов конфигурации не зависит от его положения — вот почему так много шума вокруг условных ветвей nginx (Если это зло, и подобные.) И это, наверное, то, что Игорь Сысоев и его команда давно осознали и начали внедрять полноценное программное расширение nginx - lua, вместо того, чтобы исправлять проблемы в зародыше программирования конфига nginx (это почему оно частичное и неполное - если бы не давало еще, порядок ifs и установленs является неявным и так далее. Поэтому, как только вы захотите поместить код в файлы конфигурации nginx, вы должны начать использовать lua (или что-то еще). Lua можно добавить с помощью открытый nginx, которая содержит правильно построенный lua с кучей расширений и примеров, или просто добавляющий lua модуль nginx отдельно, это зависит от используемого вами дистрибутива.

Nick Hatfield avatar
флаг co
Спасибо за понимание. Я использую последний докер-контейнер nginx версии 1.14.2. Можете ли вы привести пример того, как решить вышеуказанную проблему с помощью perl или lua? Спасибо
drookie avatar
флаг za
пример perl находится под первой ссылкой, которую я дал.
Nick Hatfield avatar
флаг co
Потрясающе, спасибо!!
Nick Hatfield avatar
флаг co
Эй, снова я... так что пример Perl, кажется, показывает и подходит только для случая использования, когда клиент отправляет URI, например `SoMeThInG`, а команда perl преобразует `nginx.var.uri` в нижний регистр нить. Мне трудно заставить это работать со сценарием, который я описал выше, когда пользователь отправляет HTTP-заголовок `-H "apikey: SoM3RaNd0m"`, и нам нужно захватить это и сделать его строчным, а затем отправить к местоположению и сделать так, чтобы оно соответствовало нижнему регистру. `http_apikey: S0m3RaD0m3` `(perl => http_apikey_lowercase)` `место ~ ^/hnt-$http_apikey_lowercase {}`

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.