在Heroku上,POST请求被接收为GET请求

3
为什么我的PHP脚本在Heroku上运行,但未能接收到被另一个域名的HTML表单设置的POST参数?



背景:

我有一个简单的HTML表单,它将一些用户数据发送到我放在Heroku上的PHP脚本中。该表单位于不同的站点/域上,但据我所知,同源策略不应该破坏请求。事实上,我已经测试了从表单发送请求到我的本地机器,脚本工作正常。

请求从HTML表单正常触发,但是当它到达我的PHP脚本时,$_POST数组为空。在检查了Heroku日志之后,实际上看起来POST请求被我的脚本接收为GET请求。

是否只是我没有做配置/路由的事情(我是Heroku的新手)?

我看了一下其他几个问题/答案,比如this one,但是还没有解决方案适用于我。

非常感谢您的帮助。



更新1(4/4/12)

看起来POST请求正在按照CoR在他的答案中描述的方式进行移动。但我无法弄清如何阻止这种情况发生。通过调查,似乎只有当您不通过https进行请求时,才会发生此POST请求的移动。

目前,我已经提交并更改了表单的方法为GET,这很好用。当然,如果能够在Heroku应用程序上启用POST请求而不设置SSL,那就太好了。



更新 2 (6/4/12)

我刚刚向Heroku提交了一个工单,以找出是否唯一支持POST请求的方法是启用SSL。当然,在提问之前,我查看了他们的文档以获取答案,但没有描述POST被移动为CoR的相关内容。当他们回复我时,我会在这里发布答案。


如果服务器重定向了请求(3xx响应代码),它可以被更改为GET。 - Danijel
更新了我的回答 :) - CoR
谢谢 @CoR!我认为针对我的问题,你不能解决它而不向您的Heroku应用程序添加SSL支持,这将花费每月20美元。我想现在把它作为答案添加。 - kylejs
实际上,我会向Heroku再确认并询问他们。马上回来。 - kylejs
如果您不通过https进行制作,会发生什么情况?+1——在本地测试后忘记添加“s”,这让我很困扰。非常感谢您提供的细节! - Brian Moeskau
2个回答

5

好的!终于搞定了!在 Heroku 团队中,有一位超级棒的成员在 10 分钟内回复了我,结果发现只是一个愚蠢的错误。

我的表单将请求发送到 http://MYAPP.heroku.com,但实际上 Heroku 应用位于 http://MYAPP.herokuapp.com。仅此而已。因此,当我的请求被发送到 http://MYAPP.heroku.com 时,显然它被移动了位置。

此外,当(正确地)使用 herokuapp.com 域名时,您可以通过 HTTPS 发送请求,尽管通过 HTTP 发送 POST 请求也可以正常工作。

SSL 插件 仅用于具有自定义域并希望为其启用 SSL 的情况。


4

我花了几天时间来理解url重定向的定义,现在给大家简单介绍一下:

301 –   Permanently moved:  breaks POST
302 –   Temporarily moved:  legacy, will change POST to GET
303 -   Temporarily moved: WILL change POST to GET
307 -   Temporarily moved: NOT change POST to GET

编辑:

看起来只有当您不通过https进行POST请求时,才会发生此移动。

是的,我忘了人们通常使用重定向来统一尾随斜杠、www并强制使用http或https协议。
正如您可能猜到的那样,301或302重定向可能会破坏POST。通过使用307修复它,或者写信给网站管理员,他可能会或可能不会“修复”它。
这取决于它是否会破坏其他内容,或者该网站是否希望强制其用户始终使用https!在这种情况下,301是理想的解决方案,因为将POST发送到不安全的http协议会自动丢弃/转换为GET请求。
如果例如第一个登录数据是通过http发送的,则服务器使用https无关紧要。

当然,知道是否可以在没有设置SSL的情况下启用Heroku应用程序上的POST请求将是好的。

虽然从技术上讲是可能的,但禁用HTTP上的POST并强制使用https仅是有效的服务器策略。


太棒了,谢谢。我该怎么修复它?你肯定可以将POST请求发送到Heroku应用程序中吧? - kylejs
尝试找出您的请求被重定向的方式和原因。人们通常创建自动重定向以添加/删除URL中的www或尾随/。301和302将始终将POST转换为GET头。307将保留POST。 - CoR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接