应该这么简单。我已经按照我能找到的每个教程和论坛,但我无法让它工作。我只是想在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。
答案 0 :(得分:15)
您无需配置任何内容。只需确保请求映射到您的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使网址完全符合逻辑。
另请参阅AcceptPathInfo指令的文档以及有关如何make PHP not parse POST data when enctype is multipart/form-data
的问题。
答案 1 :(得分:0)
AllowOverride AuthConfig
试试这个。身份验证可能是问题所在。我正在使用用C ++编写的CGI脚本,并在通过DELETE时面临一些身份验证问题。以上解决方案帮助了我。它也可能对你的情况有所帮助。
即使你没有得到PUT和DELETE问题的解决方案,也不要停止工作而是使用“CORS”。它是一个谷歌浏览器应用程序,它将帮助您绕过问题,但请记住它是一个临时解决方案,以便您的工作或实验不会长时间保持冻结。显然,您不能要求您的客户启用“CORS”来运行您的解决方案,因为它可能会危及系统安全。
答案 2 :(得分:-1)
IIRC表单方法属性的目的是定义不同的传输方法。因此,HTML 5.2仅定义用于传输和对话操作的GET,POST和DIALOG方法,而不定义服务器应如何处理数据。
Ruby-on-rails通过对所有内容使用POST / GET并添加定义实际ReST方法的隐藏表单变量来解决此问题。这种方法比较笨拙且容易出错,但确实减轻了HTML标准和浏览器开发人员的负担。
form方法是在ReST之前定义的,因此即使在启用Apache和PHP之后,也无法在HTML中定义ReST,因为浏览器符合HTML,因此对于所有非HTML定义的值,默认为GET / POST。这意味着,当您使用PUT方法将表单发送到浏览器时,浏览器会将其更改为GET并改用GET。但是,隐藏变量通过所有不变的内容,因此您可以使用它自定义表单处理过程。
希望有帮助
答案 3 :(得分:-3)
在Linux上,/etc/apache2/mods-enabled/php5.conf dans php5.load
存在。如果没有,启用此模块(可能需要sudo apt-get install libapache2-mod-php5
)。
答案 4 :(得分:-3)
您可以在服务器上发布要删除的文件名delete.php,这样可以轻松取消链接()文件。
答案 5 :(得分:-6)
使用PUT和DELETE请求的技术限制不在于PHP或Apache2;相反,它是浏览器发送这些类型请求的负担。
简单地将&lt; form action =“”method =“PUT”&gt;将无法工作,因为没有支持该方法的浏览器(他们只是默认为GET,处理PUT与处理像FDSFGS这样的乱码一样)。遗憾的是,这些HTTP动词仅限于非桌面应用程序浏览器领域(即:Web服务消费者)。