Вкратце: как мне обойти ошибки «411 Length required» от nginx, работающего в DotCloud?
У меня есть API с поддержкой CORS, развернутый как служба Python на платформе DotCloud. Когда мой клиент javascript пытается получить к нему доступ, браузер запускается с запросом OPTIONS, но возвращает 411.
Похоже, nginx в DotCloud не любит HTTP-запросы с пустым телом. Я видел предложения добавить заголовок «Content-Length: 0» или попытаться использовать модуль chunkin
, но я не могу сделать ни того, ни другого:
- Я не контролирую заголовки HTTP-запросов, которые браузер добавляет для своего запроса OPTIONS.
- Я не думаю, что смогу установить сторонний модуль nginx в DotCloud. Даже если бы я мог, это может даже не помочь, поскольку в запросе нет заголовка «Transfer-encoding: chunked».
Любые идеи, как обойти эту проблему?
Обновление:
Помещение следующего в nginx.conf
решает мою насущную проблему. Подобно чанкину, он перехватывает 411 ошибок и возвращает стандартный ответ, если метод запроса равен OPTIONS
. Наткнулся на это в этом репозитории.
error_page 411 = @cors;
location @cors {
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type, Authorization, ...';
add_header Access-Control-Max-Age '1800';
add_header Content-Length 0;
add_header Content-Type text/plain;
return 200;
}
return 411;
}
Это не идеально, так как я хотел бы обрабатывать эти ответы в коде Python, а не в конфигурации nginx. И я ожидаю проблем в будущем с запросами DELETE и HEAD — у них также нет тела запроса.