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

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

当 Nginx 收到缺少 Host 标头的请求时,它会以 400 响应拒绝该请求。正如它应该做的那样。

有没有办法解决?

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

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

我尝试使用headers-more-nginx模块,因为我相信它可以在处理请求之前向请求添加标头。我为此虚拟主机的 server{} 块添加了以下行:

more_set_input_headers  "Host: device.myserver.com";

但请求仍然被拒绝,错误代码为 400。

编辑:

我忘了说这些设备目前能够向 lighttpd 1.4.28 网络服务器发出请求。我正尝试让它们在 Nginx 上运行。我在 lighttpd 配置文件中找不到任何允许此功能运行的特殊内容,似乎 lighttpd 不需要此标头。

编辑2:

tcpdump 的结果(我把不应该放到网上的内容用 X 标记出来了):

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

答案1

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

杂项名称

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

如果需要在非默认的服务器块中处理没有“Host”标头字段的请求,则应指定一个空名称:

server {
    listen       80;
    server_name  example.org  www.example.org  "";
    ...
}

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

因此,在 server_name 中添加“”似乎可以实现您想要的效果。

相关内容