如何通过 Apache2 和 PHP 启用和使用 HTTP PUT 和 DELETE?

问题描述 投票:0回答:6

本来就应该这么简单。我已经遵循了我能找到的所有教程和论坛,但我无法让它工作。我只是想在 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 apache rest
6个回答
18
投票

您无需配置任何内容。只需确保请求映射到您的 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 使 URL 完全符合逻辑。

另请参阅 AcceptPathInfo 指令的文档以及有关如何 使 PHP 在 enctype 为

multipart/form-data
时不解析 POST 数据的问题。


0
投票

对我来说,原因是我不小心向不存在的路径发出了请求(

/users
)。

奇怪的是,

curl -v --request PUT localhost:8080/users
返回
405 Method Not Allowed
而不是我预期的
404 Not Found
,而
curl -v --request GET localhost:8080/users
返回
404 Not Found

curl -v --request PUT localhost:8080/
curl -v --request DELETE localhost:8080/
按预期返回
200 OK
并仅使用默认的 php:apache docker 映像到达我的 DocumentRoot 中的 index.php。


-2
投票

允许覆盖 AuthConfig

试试这个。身份验证可能是问题所在。我正在使用用 C++ 编写的 CGI 脚本,在通过 DELETE 时遇到一些身份验证问题。上述解决方案对我有帮助。它也可能对您的情况有所帮助。


此外,即使您没有找到 PUT 和 DELETE 问题的解决方案,也不要停止工作,而是使用“CORS”。这是一个谷歌浏览器应用程序,它将帮助您绕过这个问题,但请记住这是一个临时解决方案,这样您的工作或实验就不会长期冻结。显然,您不能要求您的客户启用“CORS”来运行您的解决方案,因为这可能会损害系统安全。


-3
投票

在 Linux 上,

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


-4
投票

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

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

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

希望有帮助


-8
投票

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

简单地放置

是行不通的,因为没有浏览器支持该方法(它们只是默认为 GET,对待 PUT 的方式与处理 FDSFGS 等乱码的方式相同)。遗憾的是,这些 HTTP 动词仅限于非桌面应用程序浏览器的领域(即:Web 服务消费者)。

© www.soinside.com 2019 - 2024. All rights reserved.