我已将使用 Cherrypy 3.1.2 的应用程序置于配置为反向代理的 Nginx 之后。 一切都适用于 GET 请求,但所有 POST 请求都返回 HTTP 400 - Malformed header。
我追踪到 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 header 的正确格式的请求:
此外,从 p.1 截断的字节数似乎取决于表单上有多少 POST 数据,例如,我在/home FORM 字段中键入的字符越多,HTTP header 中的字符就越多被删除。
显然,当 Nginx 将 header 传递给上游服务器(我的应用程序)时,它以某种方式破坏了 header 。
但是:当我只是为了测试让 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)。
最佳答案
你可以试试参数:
ignore_invalid_headers on;
sendfile on;
在 http block 中...也可以尝试禁用 keepalive 并确保您正在记录访问/错误以进行调试。
关于python - Nginx 反向代理 POST 请求背后的 CherryPy 损坏/截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2272931/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_