Как намеренно вызвать 400 Bad Request в Nginx?

Я разделил свой предыдущий вопрос на два.

Потребитель моего REST API говорит, что иногда я возвращаю 400 Bad Request — запрос, отправленный клиентом, был синтаксически неправильным. ошибка.

Журналы моего приложения (Python/Flask), похоже, не фиксируют это, как и журналы моего веб-сервера/Nginx.

Я изменил стандартные HTML-коды сообщений об ошибках 400 и 404, добавив следующую строку в конфигурацию (и добавив соответствующие 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 возвращать соответствующий HTML-код ошибки, вызвав недопустимый URL-адрес.


person Matthew Moisen    schedule 02.09.2015    source источник


Ответы (2)


Создайте в конфигурации NGINX место для возврата 400 ошибок:

location /error { 
    return 400;
}

Престо.

person Naftuli Kay    schedule 02.09.2015

Nginx вернет код состояния 400, если получит поле заголовка больше настроенного large_client_header_buffers

Поле заголовка запроса также не может превышать размер одного буфера, иначе клиенту будет возвращена ошибка 400 (Bad Request). Буферы выделяются только по запросу. По умолчанию размер буфера равен 8Кбайт. Если после окончания обработки запроса соединение переходит в состояние keep-alive, эти буферы освобождаются.

Источник: http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers

Так что вам просто нужно создать curl-запрос с заголовком больше 8k. Вот пример использования 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
person Joe Young    schedule 02.09.2015