为什么我的PHP脚本收到的另一个域上的html表单设置的POST参数不是由Heroku托管的?
上下文:
我有一个简单的html表单,它将一些用户数据发送到我放在Heroku上的PHP脚本。表单位于不同的站点/域上,但据我所知,同源策略不应该破坏请求。事实上,我已经测试过将表单中的请求发送到我的本地计算机,脚本运行正常。
请求从html表单中正常激活,但是当它到达我的PHP脚本时,$ _POST数组为空。检查Heroku日志后,实际上看起来我的脚本会将POST请求作为GET接收。
是否只是我没有做过的配置/路由(我是Heroku的新手)?
我看了一些其他问题/答案,例如this one,但还没有解决方案对我有效。
非常感谢您的帮助
更新1 (4/4/12)
似乎正在按照CoR在他的回答中描述的那样移动POST请求。我无法弄清楚如何阻止这种情况发生。通过研究,看来只有在你没有通过https进行POST请求时才会发生这种移动请求。
现在我已经提交并将表单方法更改为GET,效果很好。当然很高兴知道是否可以在没有设置SSL的情况下在他们的Heroku应用程序上启用POST请求。
更新2 (6/4/12)
我刚刚与Heroku打开了一张票,以确定支持POST请求的唯一方法是启用SSL。我当然在这里询问之前查看了他们的文档以获得答案,但是当CoR已经回答时,没有任何与POST被移动相关的内容。当他们回到我身边时,我会在这里发帖(...)。
答案 0 :(得分:4)
我花了几天时间将网址重定向咀嚼成可理解的定义。 他们在这里:
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
编辑:
似乎只有你自己才会发生POST请求的移动 没有通过https制作它们。
是的,我忘记了人们通常使用重定向来统一尾随斜线,www。并强制执行http或https协议 正如您可能猜到的那样,301或302重定向可能会破坏POST。使用307或写入网站管理员修复它,他可能会或可能不会修复它' 这取决于它是否会破坏其他东西,或者该网站可能会强迫用户始终使用https!在那种情况下,301是理想的解决方案,因为通过不安全的http协议发送POST被自动丢弃/转换为GET请求 如果服务器使用https,例如第一次登录数据是由http发送的,则无关紧要。
当然可以知道是否可以启用POST请求 他们的Heroku应用程序没有设置SSL。
虽然技术上可行,但是通过http禁用POST并强制它仅使用https是有效的服务器策略。
答案 1 :(得分:4)
好!终于明白了!在一个超级棒的Heroku团队在10分钟内回到我身边后,结果证明是一个愚蠢的错误。
我的表单是将请求发送给http://MYAPP.heroku.com
,而一个人的Heroku应用实际上是http://MYAPP.herokuapp.com
。就这样。显然,当我的请求被发送到http://MYAPP.heroku.com
时,我的请求就会被移动。
此外,当(正确)使用herokuapp.com
域时,您可以通过HTTPS发送请求,但通过HTTP发送POST请求将正常工作。
仅当您拥有自定义域并希望为其启用SSL时,才会SLL Add-On。