【问题标题】:$_POST values gone after SSL turned onSSL 开启后 $_POST 值消失
【发布时间】:2012-02-26 19:47:40
【问题描述】:

在 android 中,我尝试以 json 结构发送到 Web 服务器。它适用于http。但是使用 https,$_POST 值对就消失了。在 PHP 中,var_dump $_POST 返回 array(0) 但是,HttpGet 对 http 和 https 都适用。

        MyHttpClient httpClient = new MyHttpClient(context);

        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

【问题讨论】:

  • 是的,您在 php 中发现了一个其他人从未拥有过的错误 - 或者 - 您的代码。你猜哪个?
  • 也许您的 POST 请求以某种方式被重定向,然后丢失了发布数据?
  • 如果我设置 HttpClientParams.setRedirecting(params, false);然后页面返回“临时断开的链接已修复”

标签: php android json ssl


【解决方案1】:

如果我设置 HttpClientParams.setRedirecting(params, false);然后页面 返回“临时断开的链接已修复”

听起来您将请求发送到 http:// URL 并指望重定向(可能通过 mod_rewrite 或类似的东西,例如 PHP 代码本身中的重定向)将您的页面变成 https .

这种操作模式首先向服务器发出纯 HTTP 请求,然后服务器告诉客户端资源已移动到https:// 地址。反过来,如果激活了自动重定向,客户端会发出第二个请求。

根据the HTTP specification, for status codes 301 or 302(用于重定向),

如果收到 301/302 状态代码以响应请求,而不是 GET 或 HEAD,用户代理不能自动重定向 请求,除非它可以被用户确认,因为这可能 更改发出请求的条件。

大多数浏览器将此解释为“如果第一个请求是 POST,则不要重新发送重定向请求的数据,但无论如何都要使第二个请求成为 GET。”这可以解释为什么您在第二次尝试时会丢失任何已发布的正文。

请注意,由于this answer 中解释的原因,过度依赖重写/重定向将http:// 请求转换为https:// 请求应被视为不好的做法。

【讨论】:

  • 我尝试在浏览器中键入 https URL,它会将我重定向到另一个链接。我将 URL 更改为 java 中的重定向 URL,它起作用了!
【解决方案2】:

尝试在php中捕捉raw post data

$data = file_get_contents('php://input');

【讨论】:

  • 什么都没有。我将 $data 保存到错误日志中: $data = file_get_contents('php://input'); error_log($data,0);
  • 如果 $_REQUEST 也没有得到任何东西,然后在 java 或 url 中搜索问题。 + 尝试使用某种日志文件而不是 error_log() 因为可能存在 apache 配置问题。
猜你喜欢
  • 1970-01-01
  • 2022-11-19
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多