Назад | Перейти на главную страницу

Как проверить наличие заголовка ответа в правилах Nginx?

Настройка правил перезаписи для запрос оказалось довольно просто в Nginx. Для ответ, не так много (по крайней мере, не для меня). Я хочу удалить заголовок Content-Type из ответа, если заголовок Content-Length ответа не установлен. у меня есть NginxHttpHeadersMoreModule установлен, так что это должно позволить мне удалить заголовок, но я не могу найти способ проверить наличие заголовка Content-Length ответа с помощью правила в конфигурации Nginx. Мы будем очень благодарны за любые предложения о том, как это сделать!

Я думаю, вам нужно что-то вроде следующего в location блок:

if ($sent_http_content_length ~ '') {
    more_clear_headers Content-Type
    ...
}

Видеть $ sent_http_name

(Отказ от ответственности: я не пробовал это; я просто покопался в документации, потому что нашел вопрос интересным. Это может работать, а может и не работать)

Похоже, кто-то спросил об этом в Stack Overflow, и для каждого отправленного заголовка есть переменная $ sent_http_my_custom_header.

Видеть https://web.archive.org/web/20140606142058/http://wiki.nginx.org/HttpCoreModule#.24sent_http_HEADER для подробностей.

Ссылка: https://stackoverflow.com/questions/12431496/nginx-read-custom-header-from-upstream-server

Что ж, проверка на отсутствие чего-либо - всегда проблема ... но ....

Обычно я подключаюсь к порту, который прослушивает nginx, и делаю вручную созданный http-ответ:

telnet www.stackoverflow.com 80
Trying 69.59.196.211...
Connected to stackoverflow.com.
Escape character is '^]'.
GET /index.html HTTP/1.1
host: www.stackoverflow.com

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Fri, 30 Jul 2010 14:31:02 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Location: http://stackoverflow.com/index.html
Content-Length: 158

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="http://stackoverflow.com/index.html">here</a></body>

Вы также можете использовать параметры заголовка дампа для curl или wget. Например, wget поддерживает:

   -S
   --server-response
       Print the headers sent by HTTP servers and responses sent by FTP
       servers.

Наконец, пользовательское ведение журнала может позволить вам добавить определенные заголовки ответа, например:

log_format up_head '$remote_addr - $remote_user [$time_local]  $request '
  'upstream_http_content_type $upstream_http_content_type';

Есть переменная $content_length что согласно документация является равно строке Content-Length заголовка запроса. Вы, наверное, можете сделать

if ($content_length = 0) {
    do stuff with header
}

Я не уверен, какое значение примет $ content_length, и даже если оно будет существовать, если заголовок отсутствует, но вы можете использовать это как отправную точку для решения.