我希望 Nginx444
在处理没有标头的请求时host
。
我读过了http://nginx.org/en/docs/http/request_processing.html和未定义时 Nginx 默认主机,其中写道:
"If its value does not match any server name, or the request does not contain
this header field at all, then nginx will route the request to the default server
for this port."
我已经配置了
server {
listen 80 default_server;
# Since version 0.8.48, this is the default setting for the server name,
# so the server_name "" can be omitted.
# server_name "";
return 444;
}
然后我请求
telnet localhost 80<enter>
GET / HTTP/1.1<enter>
<enter>
并收到一个400
,不是444
我预期的:
HTTP/1.1 400 Bad Request
Server: nginx/1.2.5
Date: Wed, 28 Nov 2012 21:01:59 GMT
Content-Type: text/html
Content-Length: 172
Connection: close
[body]
同样的情况也发生在我
telnet localhost 80<enter>
GET / HTTP/1.1<enter>
Host:<enter>
当没有提供标头时,如何让 Nginx 达到 444 host
?如果服务器认为该请求是错误请求,这是否不可能?
答案1
从RFC 9112“HTTP/1.1”,“3.2 请求目标”部分:
服务器必须使用
400 (Bad Request)
状态代码来响应任何缺少标头字段的 HTTP/1.1 请求消息Host
以及任何包含多个Host
标头字段行或Host
具有无效字段值的标头字段的请求消息。
答案2
您仍然可以捕获 400 错误并返回 444。对于没有标Host
头的请求,以下方法对我有效
server {
listen 80;
server_name "";
return 444;
error_page 400 = @400;
location @400 {
return 444;
}
}
PS:如果您不发送、、或奇怪的只是,您仍然会GET /xxx HTTP/1.x
得到400 。POST /xxx HTTP/1.x
HEAD /xxx HTTP/1.x
GET /