簡體   English   中英

如何在Apache2和PHP中啟用和使用HTTP PUT和DELETE?

[英]How to enable and use HTTP PUT and DELETE with Apache2 and PHP?

應該這么簡單。 我已經按照我能找到的每個教程和論壇,但我無法讓它工作。 我只是想在Apache2上用PHP構建一個RESTful API。

在我的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。

您不需要配置任何東西。 只需確保請求映射到您的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.

您可以使用MultiViews隱藏“php”擴展名,也可以使用mod_rewrite使URL完全符合邏輯。

另請參閱AcceptPathInfo指令的文檔以及當enctype為multipart/form-data如何使PHP不解析POST multipart/form-data

AllowOverride AuthConfig

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


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

IIRC表單方法屬性的目的是定義不同的傳輸方法。 因此,HTML 5.2僅定義用於傳輸和對話操作的GET,POST和DIALOG方法,而不是服務器應如何處理數據。

Ruby-on-rails通過對所有內容使用POST / GET並添加定義實際ReST方法的隱藏表單變量來解決此問題。 這種方法更加笨拙且容易出錯,但確實消除了HTML標准和瀏覽器開發人員的負擔。

表單方法是在ReST之前定義的,因此即使在啟用Apache和PHP之后也無法在HTML中定義ReST,因為瀏覽器符合HTML,因此默認為所有非HTML定義值的GET / POST。 這意味着,當您使用PUT方法將表單發送到瀏覽器時,瀏覽器會將其更改為GET並使用它。 但是,隱藏變量會傳遞所有未更改的內容,因此您可以使用它來自定義表單處理過程。

希望有所幫助

您可以在服務器上發布要刪除的文件名delete.php,這樣可以輕松取消鏈接()文件。

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

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

簡單地說<form action =“”method =“PUT”>將無效,因為沒有支持該方法的瀏覽器(並且它們只是默認為GET,處理PUT與處理像FDSFGS這樣的亂碼一樣)。 遺憾的是,這些HTTP動詞僅限於非桌面應用程序瀏覽器領域(即:Web服務使用者)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM