2010-05-29 174 views
30

應該這麼簡單。我已經關注了我可以找到的每個教程和論壇,但我無法實現它。我只是想在Apache2上用PHP構建一個RESTful API。如何使用Apache2和PHP啓用和使用HTTP PUT和DELETE?

在我的VirtualHost指令我說:

<Directory /> 
    AllowOverride All 
    <Limit GET HEAD POST PUT DELETE OPTIONS> 
     Order Allow,Deny 
     Allow from all 
    </Limit> 
</Directory> 

然而,每一個PUT請求我做服務器,我得到不支持405方法。

有人主張使用Script指令,但由於我使用mod_php,而不是CGI,我不明白爲什麼這會起作用。

人們提到使用WebDAV,但對我來說,似乎是矯枉過正。畢竟,我不需要DAV鎖定,DAV文件系統等。我想要做的就是將請求傳遞給PHP腳本並自行處理所有事情。我只想啓用PUT和DELETE以獲得乾淨的語義。

回答

17

你不需要配置任何東西。只要確保請求映射到您的PHP文件並使用具有路徑信息的請求。例如,如果你在根有一個文件名爲handler.php與此內容:

<?php 

var_dump($_SERVER['REQUEST_METHOD']); 
var_dump($_SERVER['REQUEST_URI']); 
var_dump($_SERVER['PATH_INFO']); 

if (($stream = fopen('php://input', "r")) !== FALSE) 
    var_dump(stream_get_contents($stream)); 

下面的HTTP請求將工作:

Established connection with 127.0.0.1 on port 81 
PUT /handler.php/bla/foo HTTP/1.1 
Host: localhost:81 
Content-length: 5 
  
boo 
HTTP/1.1 200 OK 
Date: Sat, 29 May 2010 16:00:20 GMT 
Server: Apache/2.2.13 (Win32) PHP/5.3.0 
X-Powered-By: PHP/5.3.0 
Content-Length: 89 
Content-Type: text/html 
  
string(3) "PUT" 
string(20) "/handler.php/bla/foo" 
string(8) "/bla/foo" 
string(5) "boo 
" 
Connection closed remotely. 

您可以隱藏「PHP」擴展與MultiViews或者你可以使URL完全符合mod_rewrite

另請參閱AcceptPathInfo指令和如何make PHP not parse POST data when enctype is multipart/form-data這個問題的文檔。

+0

非常好,非常感謝! – 2010-05-30 11:50:08

+0

使用cURL命令行:「curl -X PUT --header」Content-Type:application/octet-stream「--data-binary」@ 1.gif「-v /handler.php/bla/foo」和PHP內部將文件內容轉儲到文件中。它效果很好。不過,我需要發送一些額外的信息,例如。令牌與請求上傳文件。我想我應該使用POST。 – 2011-11-28 12:11:44

+0

令牌也可以在標題中;) – 2013-06-27 15:08:54

-6

使用PUT和DELETE請求的技術限制不在於PHP或Apache2;而是由瀏覽器負擔發送這些類型的請求。

乾脆把<形式行動=「」方法=「PUT」 >將無法​​工作,因爲沒有瀏覽器支持該方法(和它們只會默認爲GET,治療把同樣的,因爲它會對待胡言亂語像FDSFGS )。可悲的是,這些HTTP動詞僅限於非桌面應用程序瀏覽器領域(即:Web服務消費者)。

+11

他說他想要一個寧靜的API,所以它可能沒有什麼可做的瀏覽器。無論如何,目前的瀏覽器支持PUT,DELETE等通過XmlHttpRequest – Artefacto 2010-05-29 22:48:27

-3

在linux上,存在/etc/apache2/mods-enabled/php5.conf dans php5.load。如果不是,啓用此模塊(可能需要sudo apt-get install libapache2-mod-php5)。

+0

您可以請使用代碼標籤?這使它更具可讀性。 – Styxxy 2012-11-04 23:12:53

-3

您只需將文件名刪除到服務器上的delete.php,即可輕鬆取消鏈接()該文件。

+0

聲明的問題是PUT文件失敗。請說明爲什麼您認爲將數據發佈到服務器將通過PUT方法修復失敗。你不能在一個HTTP請求中使用兩種不同的方法(POST和PUT),所以我看不出你的答案如何解決問題。 – AnotherSmellyGeek 2016-06-29 04:34:42

0

的AllowOverride AuthConfig

嘗試。身份驗證可能是問題。我正在使用用C++編寫的CGI腳本,並在通過DELETE時遇到一些身份驗證問題。上面的解決方案幫助了我。它也可能有助於你的情況。


而且即使你沒有得到你的PUT的問題的解決方案和DELETE,不要停止工作,而使用「CORS」。這是一個谷歌瀏覽器應用程序,它可以幫助你繞開這個問題,但要記住它是一個臨時解決方案,以便你的工作或實驗不會長時間凍結。顯然,您不能要求客戶啓用「CORS」來運行您的解決方案,因爲這可能會危及系統安全。

+0

爲什麼您認爲認證可能是根本原因,儘管所述問題是405而不是403? CORS與HTTP方法的可接受性或認證有什麼關係?你能否澄清你的答案,明確你說的這三個概念中的哪一個? – AnotherSmellyGeek 2016-06-29 04:32:19

相關問題