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

如何在Apache2和PHP中启用和使用HTTP PUT和DELETE?,php,apache,rest,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>

它应该如此简单。我已经关注了我能找到的每一个教程和论坛,但我无法让它工作。我只是想在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脚本,然后自己处理所有事情。我只想为clean语义启用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));
您可以使用隐藏“php”扩展,也可以使用使URL完全符合逻辑


另请参见该指令的文档以及关于如何执行的问题。

使用PUT和DELETE请求的技术限制不在于PHP或Apache2;相反,浏览器有责任发送这些类型的请求


简单的PUT将不起作用,因为没有支持该方法的浏览器(它们将默认为GET,对待PUT就像对待FDSFG一样胡言乱语)。遗憾的是,这些HTTP动词仅限于非桌面应用程序浏览器领域(即:web服务使用者)。

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

您只需将要删除的文件名发布到服务器上的delete.php,即可轻松取消文件的链接() AllowOverride AuthConfig

试试这个。身份验证可能是问题所在。我正在使用C++编写的CGI脚本,在传递删除时会面临一些认证问题。上述解决方案对我很有帮助。这可能对你的情况也有帮助



此外,即使您没有找到放置和删除问题的解决方案,也不要停止工作,而是使用“CORS”。这是一款谷歌chrome应用程序,可以帮助你绕过这个问题,但请记住这是一个临时解决方案,这样你的工作或实验就不会长时间冻结。显然,您不能要求客户端启用“CORS”来运行您的解决方案,因为这可能会危及系统安全。

IIRC表单方法属性的目的是定义不同的传输方法。因此,HTML5.2仅为传输和对话操作定义GET、POST和对话方法,而不是服务器应如何处理数据

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

form方法是在ReST之前定义的,因此即使启用了Apache和PHP,也不能在HTML中定义ReST,因为浏览器符合HTML,因此默认为GET/POST所有未定义HTML的值。这意味着,当您使用PUT方法将表单发送到浏览器时,浏览器会将其更改为GET并使用该方法。然而,隐藏的变量会在不改变的情况下传递所有内容,因此您可以使用它来定制表单处理过程


希望这能有所帮助

他说他想要一个restful API,所以它可能与浏览器无关。无论如何,当前的浏览器通过XmlHttpRequestUsing cURL命令行支持PUT、DELETE等:“cURL-X PUT--header”内容类型:application/octet stream--data binary“@1.gif”-v/handler.php/bla/foo”,并在php文件内部将内容转储到文件中。它工作得很好。然而,我需要发送一些额外的信息,如令牌请求上传文件。我想我应该使用POST。令牌也可以在标题中;)这并不能回答问题@AndreasJansson,你做了什么改变让它工作?我也有同样的问题,说“你不需要做任何事情,它已经起作用了”是没有帮助的。我也有同样的问题。405在到达.php页面之前发生错误。所以我不能映射任何东西。“只要确保请求映射到您的PHP文件”正确。。。但是怎么做呢?同意,这不是一个有用的答案。你能使用代码标签吗?这使它更具可读性。尽管所述问题是405而不是403,但为什么您认为身份验证可能是根本原因?CORS与HTTP方法可接受性或身份验证有什么关系?请你澄清一下你的答案,弄清楚你说的是这三个概念中的哪一个?问题是没有归档。请澄清为什么您认为将数据发布到服务器将使用方法PUT修复故障。你不能在一个HTTP请求中使用两种不同的方法(POST和PUT),因此我看不出你的答案如何解决这个问题。你确定你的意思是“HTML”吗?好的。单击我给你的链接。方法可以省略。它的默认值是
GET
。无论如何,这并不重要;这个问题是关于HTTP服务器返回错误代码的,而不是关于HTML或RubyonRails或REST或其他您正在谈论的内容。OP甚至没有提到
。这不是我的意见。我从字面上链接到标准文档lol
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.