Как получить заголовки headers в nginx?

я создал файл headers.js для обработки запроса из header. Файл назодится в etc/nginx.

function get_code(r) {
    // Получение значения заголовка 'code'
    return r.headersIn['code'] || '-';
}
function get_versionvk(r) {
    // Получение значения заголовка 'versionVk'
    return r.headersIn['versionVk'] || '-';
}
function get_access_token(r) {
    // Получение значения заголовка 'access_token'
    return r.headersIn['access_token'] || '-';
}
export default { get_code, get_versionvk, get_access_token };


Далее в nginx.conf пробую вытащить заголовки и записать их в логи.

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
load_module modules/ngx_http_js_module.so;

events {
    worker_connections  1024;
}

http {
     js_import headers.js;
     js_set $custom_code headers.get_code;
     js_set $custom_versionvk headers.get_versionvk;
     js_set $custom_access_token headers.get_access_token;
     resolver 8.8.8.8;
     include       /etc/nginx/mime.types;
     default_type  application/octet-stream;

     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                     '"$custom_code" "$custom_versionvk" "$custom_access_token"';

     access_log  /var/log/nginx/access.log  main;

     sendfile        on;
     #tcp_nopush     on;

     keepalive_timeout  65;
 
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


Но в логах вижу 178.78.4.201 - - [11/Feb/2024:20:30:04 +0000] "GET /service2/ HTTP/1.1" 200 158 "-" "axios/1.6.5"

Пробовал еще так, тоже ничего не пишет по заголовкам headers. Тоже писал это в nginx.conf.

map $http_code $custom_code {
    default "-";
    "~^(?P<value>.+)$" $value;
}


Не пойму как прочитать заголовки, т.к. тут в коде тоже пусто

location /service4 {
    set $code $arg_code;
    set $access_token $arg_access_token;
    set $versionVk $arg_versionVk;
    proxy_pass https://api.vk.com/method/execute?code=$arg_code&access_token=$arg_access_token&v=$arg_versionVk;
    proxy_bind 7******.156;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
}


Запрос отправляю на сервер так:
async checkIsClosedGroup(code, ip) {
    const access = process.env['ACCESS_TOKEN'];
    const versionVk = process.env['VERSION_VK'];

    try {
      const response = await firstValueFrom(
        this.httpService.get<any>(`${ip}`, { headers: {
              'code': encodeURIComponent(code),
              'versionVk': versionVk,
              'access_token': access,
            },
          })
          .pipe(
            catchError((error: AxiosError) => {
              if (error.response && 'data' in error.response && error.response.data != undefined) {
                this.logsServicePostsAdd.error(
                  `checkIsClosedGroup1 error`,
                  `ошибка получения постов в группе ${error.response} код ${code}`,
                );
              }
              throw new Error(error );
            }),
          ),
      );
        if (!response) {
        this.logsServicePostsAdd.error(
          `checkIsClosedGroup4 error`,
          `Неверный формат данных от VK API ${response} запрос не успешный для ${code}`,
        );
      }
      const data = response.data;
      console.log(data.error.request_params)
      return data;
    } catch (err) {
      console.error('Error:', err.request_params);
      await this.logsServicePostsAdd.error(
        `ошибка получения постов в группе проверяем ids ${new Date().toTimeString()} для ${err}`, 'ERRORS',
      );
    }
  }
  • Вопрос задан
  • 610 просмотров
Решения вопроса 1
karabanov
@karabanov
Системный администратор
Из заголовков Nginx формирует переменные с префиксом $http_
К примеру X-Real-IP автоматически будет преобразован в $http_x_real_ip - никаких обёрток на JS не требуется переменную можно брать и использовать везде, где это возможно, например записывать в лог.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы