事情应该如此简单。我已经遵循了我能找到的所有教程和论坛,但我无法让它工作。我只是想在 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 以获得干净的语义。
您不需要配置任何东西。只需确保请求映射到您的 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”扩展名多视图 http://httpd.apache.org/docs/2.2/content-negotiation.html或者你可以使 URL 完全符合逻辑模组重写 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html.
另请参阅文档接受路径信息 http://httpd.apache.org/docs/2.0/mod/core.html#acceptpathinfo指令和这个关于如何的问题使 PHP 在 enctype 为时不解析 POST 数据multipart/form-data https://stackoverflow.com/questions/1361673.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)