2010-05-29 147 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