【问题标题】:How to intentionally cause a 400 Bad Request in Nginx?如何在 Nginx 中故意造成 400 Bad Request?
【发布时间】:2015-11-28 14:14:54
【问题描述】:

我已将我的previous question 分成两部分。

我的 REST API 的使用者说有时我会返回 400 错误请求 - 客户端发送的请求在语法上不正确。错误。

我的应用程序(Python/Flask)日志似乎没有捕捉到这一点,我的网络服务器/Nginx 日志也没有。

我已经更改了默认的 400 和 404 错误消息 HTML,方法是在配置中添加以下行(并在正确的目录中添加相应的 HTML 页面):

    error_page  404              /404.html;
    location = /404.html {
        root   html;
    }
    error_page  400              /400.html;
    location = /400.html {
        root   html;
    }

此错误消息明确指出“Nginx”,以便我知道 Nginx 给出的是 400,而不是我的 python/flask 应用程序(其 400 已更改为明确表示“Flask”)。

有没有办法可以故意让 Nginx 返回 400 错误,可能是通过 python、CURL 或 Postman?比如我也改了404错误页面,可以故意让Nginx通过调用无效URL返回对应的错误HTML。

【问题讨论】:

    标签: python rest nginx postman http-status-code-400


    【解决方案1】:

    如果 Nginx 接收到大于配置的 large_client_header_buffers 的 header 字段,将返回状态码 400

    请求头字段也不能超过一个缓冲区的大小, 或 400 (Bad Request) 错误返回给客户端。缓冲区是 仅按需分配。默认情况下,缓冲区大小等于 8K 字节。如果在请求处理结束后连接 转换到 keep-alive 状态,这些缓冲区被释放。

    来源:http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers

    所以你只需要创建一个 header 大于 8k 的 curl 请求。下面是一个示例,使用一点 python 来生成要传递给 curl 的标头变量:

    (nginx)macbook:nginx joeyoung$ myheader=$(python -c "print 'A'*9000")
    (nginx)macbook:nginx joeyoung$ curl -vvv --header "X-MyHeader: $myheader" http://my.example.website.com
    

    结果:

    ...
    > 
    < HTTP/1.1 400 Bad Request
    < Server: nginx/1.4.7
    < Date: Wed, 02 Sep 2015 22:37:29 GMT
    < Content-Type: text/html
    < Content-Length: 248
    < Connection: close
    

    【讨论】:

      【解决方案2】:

      在 NGINX 的配置中创建一个位置以返回 400 错误:

      location /error { 
          return 400;
      }
      

      Presto。

      【讨论】:

        猜你喜欢
        • 2019-09-26
        • 2020-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        • 2011-08-31
        • 1970-01-01
        相关资源
        最近更新 更多