设置重写规则要求事实证明,在 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
...
}
(免责声明:我还没有尝试过;我只是查阅了文档,因为我发现这个问题很有趣。这可能会或可能不会起作用)
答案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 会采用什么值,或者如果标题不存在它是否会存在,但您可以将其用作解决方案的起点。