DotCloud上的CORS,411所需长度

时间:2012-11-06 13:19:42

标签: nginx cors dotcloud

tl; dr:如何解决在DotCloud上运行的nginx的“需要411长度”错误?

我在DotCloud平台上部署了作为Python服务的CORS支持API。当我的javascript客户端尝试访问它时,浏览器以OPTIONS请求启动,但返回411.

似乎在DotCloud上的nginx不喜欢具有空体的HTTP请求。我已经看到了添加“Content-Length:0”标头的建议,或尝试使用chunkin模块,但我不能这样做:

  • 我不控制浏览器为其OPTIONS请求添加的HTTP请求标头
  • 我认为我不能在DotCloud上安装第三方nginx模块。即使我可以,这可能甚至没有帮助,因为请求中没有“Transfer-encoding:chunked”标头

有任何想法如何解决这个问题?

更新

nginx.conf中加入以下内容可以解决我的问题。与chunkin类似,如果请求方法为OPTIONS,它会捕获411错误并返回预设响应。遇到它in this repo

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请求可以解决问题 - 这些也没有请求主体。

1 个答案:

答案 0 :(得分:0)

解决此问题的另一种方法是不使用nginx而是使用gunicorn 以下是此类配置的dotcloud.yml示例:

www:
    type: python-worker
    config:
        python_version: v2.7
    processes:
        api: gunicorn -b 0.0.0.0:$PORT_WWW -w 8 wsgi:app
    ports:
        www: http