2014-06-11 51 views
3

我已經嘗試了所有這些方法,可以發現已經爲其他人工作,但沒有運氣。如何使用Apache 2.2上的PHP 5.4從PUT請求中獲取數據

這裏是我的PHP代碼:

parse_str(file_get_contents("php://input"), $put_data); 
echo "foo is: " . $put_data['foo'] . "\n"; 

無論我怎麼努力,我得到「foo是:」

我想這是針對Apache作爲Nginx上運行相同的腳本服務器顯示預期的「foo是:酒吧」

事情我已經與結果沒有改變的嘗試:

更改我的Content-Type頭到應用程序/ x-WWW的形式進行urlencode d。

$put_data = fopen("php://input", "r"); 
$data = stream_get_contents($put_data); 
echo "data is: " . $data; 
fclose($put_data); 

這裏是響應頭:

添加LimitExcept中指導我的Apache的配置,像這樣

<Directory "/MyApp/Directory/"> 
    Allow From All 
    AllowOverride All 
    <LimitExcept GET POST PUT OPTIONS DELETE> 
     Deny from All 
    </LimitExcept> 
</Directory> 

使用stream_get_contents像這樣(是的,我做了更改後重新啓動):

Date: Wed, 11 Jun 2014 04:03:09 GMT 
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.24 mod_ssl/2.2.26 OpenSSL/0.9.8y 
X-Powered-By: PHP/5.4.24 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Length: 7 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

感謝任何可以提供幫助的人。現在把我的頭髮留在這個小時裏。

+0

剛剛在Apache 2.2上使用'curl -X PUT「http://my/test.php」-d foo = bar「在PHP 5.5.7上進行了本地測試,它工作得很好。你能證明你是如何提出請求的嗎? – Phil

+0

我已經完成了很多不同的工作,但最新的版本是使用DHC Chrome應用程序,它專門爲測試REST API而構建。 https://chrome.google.com/webstore/detail/dhc-rest-http-api-client/aejoelaoggembcahagimdiliamlcdmfm顯然,我將方法設置爲PUT,並嘗試了請求正文中的各種組合(例如foo = bar) 。 – evanmcd

+0

你可以嘗試通過捲曲?使用上面使用的相同命令,但也可以添加'-v'標誌以獲得額外的調試輸出。然後,將結果粘貼到您的問題 – Phil

回答

1

我測試了你的代碼,它對我的​​設置工作正常,與你的設置非常相似。我唯一能想到的是:

注意:使用php://輸入打開的流只能讀取一次;該流不支持查找操作。

來源:http://www.php.net/manual/en/wrappers.php.php

試圖找到在你的代碼已經在讀的PHP://輸入'的地方。如果你使用某種框架,這將是我的猜測。我會搜索整個項目文件以查找「php:// input」。

如果這似乎並沒有這樣的情況,請引擎收錄如下的結果:

print_r(file_get_contents("php://input"));exit; 

var_dump(file_get_contents("php://input"));exit; 

附: 音符從PHP手冊中的網站,其餘寫着:

然而,依賴於SAPI實現,有可能以 打開另一個PHP://輸入流並重新啓動閱讀。如果請求正文數據已被保存,則這隻有 可能。通常,這是POST請求的情況,而不是其他請求方法,例如PUT 或PROPFIND。

SAPI實現可能是您的nginx和Apache行爲之間的差異。