我已将使用 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 标头的正确格式的请求:
- 第一个 HTTP 标头行从开头截断了一些字节
- 然后是一个空行,指示结束 od HTTP 标头
- 然后是“POST /home HTTP/1.0”,这显然是请求的第一行。
- 编辑:这是请求的结束,所以也没有应该遵循 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)。