Nginx 处理没有主机头的请求

Nginx 处理没有主机头的请求

我希望 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.xHEAD /xxx HTTP/1.xGET /

相关内容