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;
}