8

我已将使用 Cherrypy 3.1.2 的应用程序放在配置为反向代理的 Nginx 后面。GET 请求一切正常,但所有 POST 请求都返回 HTTP 400 - 格式错误的标头。

我追踪到 CherryPy WSGI-Server 源代码以查看请求处理代码,发现如果 GET 请求的第一个请求行正确读取,例如:

GET /home HTTP/1.0

对于 POST 请求,它就像:

<HTTP headers truncated at front>

POST /home HTTP/1.0

因此,对于我的应用程序从 Nginx 接收的 POST 请求,而不是包含 GET/POST 请求行后跟 HTTP 标头的正确格式的请求:

  1. 第一个 HTTP 标头行从开头截断了一些字节
  2. 然后是一个空行,指示结束 od HTTP 标头
  3. 然后是“POST /home HTTP/1.0”,这显然是请求的第一行。
  4. 编辑:这是请求的结束,所以也没有应该遵循 HTTP POST 标头的正文数据。

此外,从 p.1 截断的字节数似乎取决于表单上有多少 POST 数据,例如,我在 /home FORM 字段中键入的字符越多,HTTP 标头中的字符就越多被删除。

显然,Nginx 在将标头传递给上游服务器(我的应用程序)时以某种方式破坏了标头。
但是:当我只是为了测试使 Nginx 重定向到一些外部网站(也使用 POST 请求)时 - 一切都很好。

所以我现在很困。

我的配置是:Windows XP Prof、Python/2.5.1、CherryPy/3.1.2、Nginx/0.8.32
浏览器:FireFox 2.0、IE 7.0
我的应用程序(独立运行)通常在多种配置下工作和测试。

我使用非常基本的 Nginx 配置,例如:

upstream backend {
    server localhost:8088 weight=1;
}
server {
    listen 80;
    server_name  localhost;

    location / {
        #proxy_read_timeout 300;

        proxy_pass http://backend;
        #proxy_redirect default;
    }
}

尽管尝试了网上找到的许多其他 proxy_pass 示例和配置。

任何想法在哪里寻找问题?Nginx 配置、我的 CherryPy 应用程序或其他地方?

新:我发现它可以正常工作,但仅适用于正文内容长度为零的 POST 请求(在没有任何字段的情况下为空进行测试)。
并验证从开头截断的字节数等于 Content-length + 一些小的 const 数(可能是 2)。

4

1 回答 1

1

你可以试试参数:

ignore_invalid_headers   on;
sendfile                 on;

在 http 块中...也可以尝试禁用 keepalives 并确保您正在记录访问/错误以进行调试。

于 2010-06-10T19:48:26.157 回答