PHP将POST请求转换为GET

PHP将POST请求转换为GET,php,iphone,ipad,http-post,in-app-purchase,Php,Iphone,Ipad,Http Post,In App Purchase,我正在尝试在iPad上创建一个应用内购买商店。作为该系统的一部分,我使用服务器托管IAP内容,并在收到有效收据时提供适当的资产。我这样做的方式是让iPad向我的服务器发送一个HTTP帖子,帖子的主体是回执数据 我的问题是:出于某种原因,服务器将POST请求解释为GET,因此php://input 它总是空的。真正奇怪的是,它可以在我的本地开发环境(Windows、Apache、PHP5.3)上工作,但不能在我的共享托管生产服务器(Linux、Apache、PHP5.2)上工作 以下是iPad的相

我正在尝试在iPad上创建一个应用内购买商店。作为该系统的一部分,我使用服务器托管IAP内容,并在收到有效收据时提供适当的资产。我这样做的方式是让iPad向我的服务器发送一个HTTP帖子,帖子的主体是回执数据

我的问题是:出于某种原因,服务器将POST请求解释为GET,因此php://input 它总是空的。真正奇怪的是,它可以在我的本地开发环境(Windows、Apache、PHP5.3)上工作,但不能在我的共享托管生产服务器(Linux、Apache、PHP5.2)上工作

以下是iPad的相关代码:

NSURL* url = [[NSURL alloc] initWithScheme:@"http" host: host path: path]; 
NSMutableURLRequest* theRequest = [[NSMutableURLRequest alloc] initWithURL: url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: 60.0f];
[url release];

[theRequest setHTTPMethod: @"POST"];
[theRequest setValue: @"application/x-www-form-urlencoded" forHTTPHeaderField: @"Content-Type"];
NSMutableData* postBody = [[NSMutableData alloc] init];
NSString* receiptString = [self newEncodedString:transaction.transactionReceipt];
[postBody appendData:[receiptString dataUsingEncoding:NSUTF8StringEncoding]];
[receiptString release];
NSString* postLength = [[NSString alloc] initWithFormat: @"%d", [postBody length]];
[theRequest setValue: postLength forHTTPHeaderField: @"Content-Length"];
[postLength release];
[theRequest setHTTPBody: postBody];
[postBody release];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
...
下面是PHP服务器代码:

$httpRequestBody = '';
$fh = @fopen('php://input', 'r');
if ($fh)
{
    while (!feof($fh)) {
        $s = fread($fh, 1024);
        if (is_string($s)) {
            $httpRequestBody .= $s;
        }
    }
    fclose($fh);
} else {
    $statusCode = 1;
}

生产服务器上的
$httpRequestBody
最终为空。当我调用
phpinfo()
时,REQUEST\u方法是GET。非常感谢您的帮助

用于读取原始帖子数据。

用于读取原始帖子数据。

不必执行循环,只要执行即可

$httpRequestBody = file_get_contents('php://input')
但是,正如您所说,由于它显示为GET,因此该方法永远不会有任何可用的数据,因为GET请求没有可读取的
主体。只有带有查询参数的URL


检查您的手机是否真的在发送帖子,然后检查您的服务器是否以某种方式将请求重写/重定向到GET中。这一切都应该在服务器的访问日志中很容易看到。

不必执行循环,只要执行即可

$httpRequestBody = file_get_contents('php://input')
但是,正如您所说,由于它显示为GET,因此该方法永远不会有任何可用的数据,因为GET请求没有可读取的
主体。只有带有查询参数的URL


检查您的手机是否真的在发送帖子,然后检查您的服务器是否以某种方式将请求重写/重定向到GET中。这一切都应该在服务器的访问日志中很容易看到。

会像使用而不是$\u GET/$\u POST一样简单吗?

会像使用而不是$\u GET/$\u POST一样简单吗?

我相信在php.ini中总是会禁用原始的\u POST\u数据,我对此没有太多的控制权。我使用的原因php://input 这是因为它取代了$HTTP_RAW_POST_数据,而无需调整php.ini。"php://input 允许您从请求正文中读取原始数据。对于POST请求,它更倾向于$HTTP_raw_POST_data,因为它不依赖于特殊的php.ini指令。“from。我相信总是在php.ini中禁用了_populate_raw_POST_data,我对它没有太多控制权。”。我使用的原因php://input 这是因为它取代了$HTTP_RAW_POST_数据,而无需调整php.ini。"php://input 允许您从请求正文中读取原始数据。如果是POST请求,它更倾向于$HTTP_raw_POST_data,因为它不依赖于特殊的php.ini指令。“from。您的回答引导我找到了解决方案。我打开了服务器上的日志记录,然后我注意到我得到了301作为HTTP状态码。发生的事情是,通过root.htaccess发生了重定向,它将我对example.com的请求更改为www.example.com。这使这篇文章变成了一篇短文。谢谢你的回答使我找到了解决办法。我打开了服务器上的日志记录,然后我注意到我得到了301作为HTTP状态码。发生的事情是,通过root.htaccess发生了重定向,它将我对example.com的请求更改为www.example.com。这使这篇文章变成了一篇短文。谢谢