nginx - читать пользовательский заголовок с вышестоящего сервера

Я использую nginx в качестве обратного прокси и пытаюсь прочитать пользовательский заголовок из ответа вышестоящего сервера (Apache), но безуспешно. Ответ Apache следующий:

HTTP/1.0 200 OK
Date: Fri, 14 Sep 2012 20:18:29 GMT 
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.10
Connection: close
Content-Type: application/json; charset=UTF-8
My-custom-header: 1

Я хочу прочитать значение из My-custom-header и использовать его в предложении if:

location / {
    // ...
    // get My-custom-header value here
    // ...
}

Это возможно? Заранее спасибо.

4 ответа

Решение

$ http_name_of_the_header_key

т.е. если у вас есть origin = domain.com в заголовке вы можете использовать $http_origin чтобы получить "domain.com"

В nginx поддерживает произвольное поле заголовка запроса. В приведенном выше примере последняя часть имени переменной - это имя поля, преобразованное в нижний регистр с черточками, замененными подчеркиванием

Ссылка на документ здесь: http://nginx.org/en/docs/http/ngx_http_core_module.html

Для вашего примера переменная будет $http_my_custom_header,

При использовании NGINX в качестве прокси есть четыре набора заголовков:

  • client -> nginx: заголовки клиентских запросов
  • nginx -> upstream: заголовки восходящего запроса
  • upstream -> nginx: заголовки ответа восходящего потока
  • nginx -> client: заголовки ответа клиента

Кажется, вы спрашиваете о заголовках ответов восходящего направления. Они находятся в переменных .

Однако учтите, что любые заголовки ответов устанавливаются только после того, как были получены заголовки из ответа вышестоящего сервера. Любые директивы запускаются перед отправкой восходящего запроса и не будут иметь доступа ни к каким заголовкам ответов! Другими словами, if Директивы запускаются после получения клиентского запроса перед отправкой восходящего запроса.

Если вам нужно изменить способ обработки ответа, вы можете использовать mapдирективу, однако, чтобы установить переменные на основе заголовков ответов, а затем использовать эти переменные вadd_header (установить заголовки ответа клиента), log_format или любые другие директивы, которые активны во время фаз ответа (внутренне названные NGX_HTTP_CONTENT_PHASE а также NGX_HTTP_LOG_PHASEфазы ). Для более сложного управления вам придется использовать надстройку сценариев, такую ​​как модуль Lua (например, с помощьюheader_filter_by_lua_blockдиректива ).

Чтобы прочитать или установить отдельные заголовки, используйте:

NGINX копирует определенные заголовки из клиентского запроса в восходящий запрос и из восходящего ответа в ответ клиента, используя различные proxy_директивы, дающие вам возможность опустить или явно включить заголовки для любого направления. Итак, если заголовок ответа восходящего потока находится только в $upstream_http_name переменных, то эти заголовки специально не копировались в ответ клиента, а набор доступных $sent_http_nameпеременные будут включать любые дополнительные заголовки, установленные NGINX, которых нет в ответе восходящего потока.

Я столкнулся с той же проблемой. Я пробовал оба $http_my_custom_header а также $sent_http_my_custom_header но это не сработало для меня.

Хотя решил эту проблему с помощью $upstream_http_my_custom_header,

Использовать $http_MY_CUSTOM_HEADER

Вы можете написать что-то вроде

set my_header $http_MY_CUSTOM_HEADER;
if($my_header != 'some-value') {
#do some thing;
}
Другие вопросы по тегам