如何检查 Nginx 规则中响应头是否存在?

如何检查 Nginx 规则中响应头是否存在?

设置重写规则要求事实证明,在 Nginx 中相当容易。对于回复,不是很多(至少对我来说不是)。如果未设置响应的 Content-Length 标头,我想从响应中删除 Content-Type 标头。我有NginxHttpHeadersMore模块安装,这样我就可以删除标头,但我似乎找不到使用 Nginx 配置中的规则来检查响应的 Content-Length 标头是否存在的方法。任何有关如何执行此操作的建议都将不胜感激!

答案1

看起来有人在 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

答案2

我猜你想在一个块中包含类似下面的内容location

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

$sent_http_name

(免责声明:我还没有尝试过;我只是查阅了文档,因为我发现这个问题很有趣。这可能会或可能不会起作用)

答案3

嗯,检查某些东西是否存在总是一个问题......但是......

我通常通过 telnet 连接到 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';

答案4

有一个变量$content_length,根据文档等于请求头的 Content-Length 行.你也许可以做到

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

我不确定 $content_length 会采用什么值,或者如果标题不存在它是否会存在,但您可以将其用作解决方案的起点。

相关内容