如何修复nginx在任何标头测试工具上抛出400个错误的请求标头?

时间:2012-09-07 09:56:58

标签: nginx

我的网站使用的是nginx,测试网站使用标题测试工具,例如http://www.webconfs.com/http-header-check.php但每次下面说400次错误请求都是该工具的输出。虽然我的所有页面在浏览器中都可以很好地加载,但是当我在chrome控制台中看到它时,状态代码为200OK。

HTTP/1.1 400 Bad Request => 
Server => nginx
Date => Fri, 07 Sep 2012 09:40:09 GMT
Content-Type => text/html
Content-Length => 166
Connection => close

我真的不明白我的服务器配置有什么问题?

一些谷歌搜索建议使用增加缓冲区大小,并将其增加到以下:

large_client_header_buffers 4 16k;

同样的结果仍然存在。

有人可以引导我走向正确的方向吗?

7 个答案:

答案 0 :(得分:56)

正如Maxim Dounin在the comments above中所述:

  

当nginx返回400(错误请求)时,它会将原因记录为错误   记录,在“信息”级别。因此,一种明显的方法可以找出正在发生的事情   是配置   error_log   在“信息”级别记录消息,并在何时查看错误日志   测试

答案 1 :(得分:8)

是的,正如Emmanuel Joubaud建议的那样改变了error_to调试级别(编辑/ etc / nginx / sites-enabled / default):

        error_log /var/log/nginx/error.log debug;

然后在重新使用nginx之后,我使用uwsgi在

中使用我的Python应用程序进入了错误日志
        2017/02/08 22:32:24 [debug] 1322#1322: *1 connect to unix:///run/uwsgi/app/socket, fd:20 #2
        2017/02/08 22:32:24 [debug] 1322#1322: *1 connected
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http upstream connect: 0
        2017/02/08 22:32:24 [debug] 1322#1322: *1 posix_memalign: 0000560E1F25A2A0:128 @16
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http upstream send request
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http upstream send request body
        2017/02/08 22:32:24 [debug] 1322#1322: *1 chain writer buf fl:0 s:454
        2017/02/08 22:32:24 [debug] 1322#1322: *1 chain writer in: 0000560E1F2A0928
        2017/02/08 22:32:24 [debug] 1322#1322: *1 writev: 454 of 454
        2017/02/08 22:32:24 [debug] 1322#1322: *1 chain writer out: 0000000000000000
        2017/02/08 22:32:24 [debug] 1322#1322: *1 event timer add: 20: 60000:1486593204249
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http finalize request: -4, "/?" a:1, c:2
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http request count:2 blk:0
        2017/02/08 22:32:24 [debug] 1322#1322: *1 post event 0000560E1F2E5DE0
        2017/02/08 22:32:24 [debug] 1322#1322: *1 post event 0000560E1F2E5E40
        2017/02/08 22:32:24 [debug] 1322#1322: *1 delete posted event 0000560E1F2E5DE0
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http run request: "/?"
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http upstream check client, write event:1, "/"
        2017/02/08 22:32:24 [debug] 1322#1322: *1 http upstream recv(): -1 (11: Resource temporarily unavailable)

然后我看了一下我的uwsgi日志,发现了:

        Invalid HTTP_HOST header: 'www.mysite.local'. You may need to add u'www.mysite.local' to ALLOWED_HOSTS.
        [pid: 10903|app: 0|req: 2/4] 192.168.221.2 () {38 vars in 450 bytes} [Wed Feb  8 22:32:24 2017] GET / => generated 54098 bytes in 55 msecs (HTTP/1.1 400) 4 headers in 135 bytes (1 switches on core 0)

在settings.py中添加www.mysite.local ALLOWED_CONFIGS修复了 问题:))

        ALLOWED_HOSTS = ['www.mysite.local']

答案 2 :(得分:6)

原因可能是URL请求中的无效编码。例如%被传递未编码。

答案 3 :(得分:4)

要清除,在 /etc/nginx/nginx.conf 中,您可以在文件的开头添加一行

error_log /var/log/nginx/error.log debug;

然后重新启动nginx:

sudo service nginx restart

通过这种方式,您可以详细说明nginx正在做什么以及它返回状态代码400的原因。

答案 4 :(得分:3)

我遇到了同样的问题,并尝试了一切。 400发生在上游代理中。 调试记录完全没有显示。

问题出在重复的proxy_set_header Host $http_host指令中,最初我没有注意到。 删除重复的副本可立即解决此问题。 我希望nginx在这种情况下说的不是400,因为nginx -t一点也不抱怨。

P.S。这是从较旧的nginx 1.10迁移到较新的1.19时发生的。在显然不能容忍之前。

答案 5 :(得分:2)

nginx返回400(错误请求)时,它将原因记录到错误日志中的“信息”级别,并在测试时查看错误日志。

答案 6 :(得分:0)

通常,Maxim Donnie的方法可以找到原因。但我遇到一个400错误的请求将不会登录到err_log。我在tcpdump

的帮助下找到了原因