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

POST request being received as GET request on Heroku


为什么由 Heroku 托管的 PHP 脚本接收的另一个域上的 html 表单设置的 POST 参数没有收到?



上下文:

我有一个简单的 html 表单,它将一些用户数据发送到我放在 Heroku 上的 PHP 脚本。该表单位于不同的 site/domain 上,但据我了解,同源策略不应破坏请求。事实上,我已经测试过将请求从表单发送到我的本地机器并且脚本运行良好。

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

是否只有 config/routing 事情我没有做过(我是 Heroku 的新手)?

我查看了其他几个 questions/answers,例如 this one,但还没有对我有用的解决方案。

非常感谢您的帮助



更新 1 (4/4/12)

似乎正在移动 POST 请求,正如 CoR 在他的回答中所描述的那样。我不知道如何阻止这种情况发生。通过四处研究,POST 请求的这种移动似乎只有在您不通过 h​​ttps 进行请求时才会发生。

现在我已经提交并将表单方法更改为 GET,效果很好。很高兴知道是否可以在不设置 SSL 的情况下在他们的 Heroku 应用程序上启用 POST 请求。



更新 2 (6/4/12)

我刚刚在 Heroku 上开了一张票,想知道支持 POST 请求的唯一方法是启用 SSL。我当然在此处询问之前查看了他们的文档以获得答案,但是没有描述与 CoR 回答时移动的 POSTs 相关的内容。当他们回复我时,我会 post (...) 在这里回答。

我花了几天时间才咀嚼 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

编辑:

it appears that this moving of POST requests only happens if you're not making them via https.

是的,我忘了人们通常使用重定向来统一尾部斜线,www。并强制执行 http 或 https 协议。
正如您可能猜测的那样,301 或 302 重定向可能会破坏 POST。使用 307 修复它或写信给网站管理员,他可能会也可能不会 'fix it'。
这取决于它是否会破坏其他东西,或者该网站可能想强迫它的用户始终使用 https!在这种情况下,301 是理想的解决方案,因为通过不安全的 http 协议发送 POST 会自动 discarded/transformed 到 GET 请求。
服务器是否使用 https 无关紧要,例如,如果第一次登录数据是通过 http 发送的。

It would of course be nice to know if one can enable POST requests on their Heroku app without setting up SSL.

尽管在技术上可行,但通过 http 禁用 POST 并强制其仅使用 https 是有效的服务器策略。

好的!终于明白了!在超级棒的 Heroku 团队之一在 10 分钟内回复我之后,结果证明这是一个愚蠢的错误。

我的表单正在将它的请求发送到 http://MYAPP.heroku.com,而一个人的 Heroku 应用程序实际上是在 http://MYAPP.herokuapp.com。就这样。所以很明显我的请求在发送到 http://MYAPP.heroku.com.

时被移动了

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

SLL Add-On 仅当您有一个自定义域并想为其启用 SSL 时。