POST 请求作为 Heroku 上的 GET 请求接收

kyl*_*ejm 2 php post http heroku http-post


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



语境:

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

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

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

我查看了其他几个类似这样的问题/答案,但还没有解决方案对我有用。

非常感谢您的帮助



更新 1 (4/4/12)

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

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



更新 2 (6/4/12)

我刚刚用 Heroku 打开了一张票,以了解支持 POST 请求的唯一方法是否是启用 SSL。我当然在此处询问之前查看了他们的文档以寻求答案,但是没有描述与 CoR 回答时移动 POST 相关的任何内容。当他们回复我时,我会在此处发布 (...) 答案。

CoR*_*CoR 5

我花了几天时间才将 url 重定向理解为可理解的定义。\n它们是:

\n\n
301 \xe2\x80\x93   Permanently moved:  breaks POST\n302 \xe2\x80\x93   Temporarily moved:  legacy, will change POST to GET\n303 -   Temporarily moved: WILL change POST to GET\n307 -   Temporarily moved: NOT change POST to GET\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:

\n\n
\n

看起来,只有当您不通过 h​​ttps 发出请求时,才会发生这种 POST 请求的移动。

\n
\n\n

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

\n\n
\n

当然,如果知道是否可以在不设置 SSL 的情况下在 Heroku 应用程序上启用 POST 请求,那就太好了。

\n
\n\n

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

\n


kyl*_*ejm 5

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

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

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

SLL的Add-On是只有当你有一个自定义域,并想启用SSL它。