Nginx - 允许没有主机标头的请求

Chr*_*s.B 6 http nginx http-headers

当 Nginx 收到缺少 Host 标头的请求时,它会拒绝该请求并返回 400 响应。正如它应该。

有没有办法解决?

有一个硬件需要能够对我的 Nginx Web 服务器进行 REST 调用,但该设备未发送主机标头。我对此无能为力,我无法控制该设备的内部运作。

这将是唯一一个与我的 Web 服务器通信且缺少主机标头的设备,并且它将始终连接到同一位置。服务器使用基于名称的虚拟主机。

我尝试使用headers-more-nginx模块重建我的服务器,因为我相信它可以在处理请求之前向请求添加标头。我将以下行添加到该虚拟主机的 server{} 块中:

more_set_input_headers  "Host: device.myserver.com";
Run Code Online (Sandbox Code Playgroud)

但请求仍然被 400 拒绝。

编辑:

我忘了提及这些设备目前能够向 lighttpd 1.4.28 Web 服务器发出请求。我正在尝试让他们在 Nginx 上工作。我在 lighttpd 配置文件中找不到任何应该允许它工作的特殊内容,似乎 lighttpd 不需要这个标头。

编辑2:

tcpdump 的结果(我删除了不应该放在网上的内容):

POST http://XXX.XXX.XXX.com/index/get-next-command HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Content-Length: 62

user=XXX&pass=XXX&v=0103HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.10-1ubuntu3.21
Set-Cookie: PHPSESSID=XXX; path=/
Set-Cookie: username=XXX; path=/
Set-Cookie: password=XXX; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html
Transfer-Encoding: chunked
Date: Thu, 03 Dec 2015 19:37:56 GMT
Server: lighttpd/1.4.28

46

!]HdEU
{"XXX":"XXX","XXX":"XXX","parameters":[]}
0
Run Code Online (Sandbox Code Playgroud)

Fre*_*edi 2

从这里: http: //nginx.org/en/docs/http/server_names.html

\n\n
\n

杂项名称

\n\n

有一些服务器名称经过特殊处理。

\n\n

如果需要在非默认服务器块中处理没有 \xe2\x80\x9cHost\xe2\x80\x9d 标头字段\n 的请求,则应指定\n 空名称:

\n\n
server {\n    listen       80;\n    server_name  example.org  www.example.org  "";\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果服务器块中没有定义 server_name,则 nginx 使用空名称作为服务器名称。

\n
\n\n

因此,将“”添加到您的 server_name 似乎可以满足您的要求。

\n

  • @Chris.B,重要的部分是 GET,无论它是否包含 HTTP/1.0。编辑,做了一个快速测试,使用“GET / HTTP/1.1”,apache和varnish可以容忍丢失的Host:,nginx不能。慢慢来。 (2认同)