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

时间:2010-05-29 09:50:58

标签: php apache rest

应该这么简单。我已经按照我能找到的每个教程和论坛,但我无法让它工作。我只是想在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。

6 个答案:

答案 0 :(得分:15)

您无需配置任何内容。只需确保请求映射到您的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使网址完全符合逻辑。

另请参阅AcceptPathInfo指令的文档以及有关如何make PHP not parse POST data when enctype is multipart/form-data的问题。

答案 1 :(得分:0)

    AllowOverride AuthConfig

试试这个。身份验证可能是问题所在。我正在使用用C ++编写的CGI脚本,并在通过DELETE时面临一些身份验证问题。以上解决方案帮助了我。它也可能对你的情况有所帮助。

即使你没有得到PUT和DELETE问题的解决方案,也不要停止工作而是使用“CORS”。它是一个谷歌浏览器应用程序,它将帮助您绕过问题,但请记住它是一个临时解决方案,以便您的工作或实验不会长时间保持冻结。显然,您不能要求您的客户启用“CORS”来运行您的解决方案,因为它可能会危及系统安全。

答案 2 :(得分:-1)

IIRC表单方法属性的目的是定义不同的传输方法。因此,HTML 5.2仅定义用于传输和对话操作的GET,POST和DIALOG方法,而不定义服务器应如何处理数据。

Ruby-on-rails通过对所有内容使用POST / GET并添加定义实际ReST方法的隐藏表单变量来解决此问题。这种方法比较笨拙且容易出错,但确实减轻了HTML标准和浏览器开发人员的负担。

form方法是在ReST之前定义的,因此即使在启用Apache和PHP之后,也无法在HTML中定义ReST,因为浏览器符合HTML,因此对于所有非HTML定义的值,默认为GET / POST。这意味着,当您使用PUT方法将表单发送到浏览器时,浏览器会将其更改为GET并改用GET。但是,隐藏变量通过所有不变的内容,因此您可以使用它自定义表单处理过程。

希望有帮助

答案 3 :(得分:-3)

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

答案 4 :(得分:-3)

您可以在服务器上发布要删除的文件名delete.php,这样可以轻松取消链接()文件。

答案 5 :(得分:-6)

使用PUT和DELETE请求的技术限制不在于PHP或Apache2;相反,它是浏览器发送这些类型请求的负担。

简单地将&lt; form action =“”method =“PUT”&gt;将无法工作,因为没有支持该方法的浏览器(他们只是默认为GET,处理PUT与处理像FDSFGS这样的乱码一样)。遗憾的是,这些HTTP动词仅限于非桌面应用程序浏览器领域(即:Web服务消费者)。