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

2022-08-30 14:03:01

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


答案 1

您无需配置任何内容。只需确保请求映射到您的 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 为多部分/表单数据时如何使 PHP 不解析 POST 数据的问题


答案 2

AllowOverride AuthConfig

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


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


推荐