如何使用Apache2和PHP启用和使用HTTP PUT和DELETE?
应该这么简单。我已经关注了我可以找到的每个教程和论坛,但我无法实现它。我只是想在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以获得干净的语义。
你不需要配置任何东西。只要确保请求映射到您的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
这个问题的文档。
使用PUT和DELETE请求的技术限制不在于PHP或Apache2;而是由浏览器负担发送这些类型的请求。
干脆把<形式行动=“”方法=“PUT” >将无法工作,因为没有浏览器支持该方法(和它们只会默认为GET,治疗把同样的,因为它会对待胡言乱语像FDSFGS )。可悲的是,这些HTTP动词仅限于非桌面应用程序浏览器领域(即:Web服务消费者)。
他说他想要一个宁静的API,所以它可能没有什么可做的浏览器。无论如何,目前的浏览器支持PUT,DELETE等通过XmlHttpRequest – Artefacto 2010-05-29 22:48:27
在linux上,存在/etc/apache2/mods-enabled/php5.conf dans php5.load
。如果不是,启用此模块(可能需要sudo apt-get install libapache2-mod-php5
)。
您可以请使用代码标签?这使它更具可读性。 – Styxxy 2012-11-04 23:12:53
您只需将文件名删除到服务器上的delete.php,即可轻松取消链接()该文件。
声明的问题是PUT文件失败。请说明为什么您认为将数据发布到服务器将通过PUT方法修复失败。你不能在一个HTTP请求中使用两种不同的方法(POST和PUT),所以我看不出你的答案如何解决问题。 – AnotherSmellyGeek 2016-06-29 04:34:42
的AllowOverride AuthConfig
尝试。身份验证可能是问题。我正在使用用C++编写的CGI脚本,并在通过DELETE时遇到一些身份验证问题。上面的解决方案帮助了我。它也可能有助于你的情况。
而且即使你没有得到你的PUT的问题的解决方案和DELETE,不要停止工作,而使用“CORS”。这是一个谷歌浏览器应用程序,它可以帮助你绕开这个问题,但要记住它是一个临时解决方案,以便你的工作或实验不会长时间冻结。显然,您不能要求客户启用“CORS”来运行您的解决方案,因为这可能会危及系统安全。
为什么您认为认证可能是根本原因,尽管所述问题是405而不是403? CORS与HTTP方法的可接受性或认证有什么关系?你能否澄清你的答案,明确你说的这三个概念中的哪一个? – AnotherSmellyGeek 2016-06-29 04:32:19
非常好,非常感谢! – 2010-05-30 11:50:08
使用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
令牌也可以在标题中;) – 2013-06-27 15:08:54