【问题标题】:How to enable and use HTTP PUT and DELETE with Apache2 and PHP?如何在 Apache2 和 PHP 中启用和使用 HTTP PUT 和 DELETE?
【发布时间】:2010-05-29 09:50:58
【问题描述】:

应该就是这么简单。我已经关注了我能找到的所有教程和论坛,但我无法让它工作。我只是想在 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


    【解决方案1】:

    您无需进行任何配置。只需确保请求映射到您的 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 指令的文档和有关如何make PHP not parse POST data when enctype is multipart/form-data 的问题。

    【讨论】:

    • 使用 cURL 命令行: "curl -X PUT --header "Content-Type: application/octet-stream" --data-binary "@1.gif" -v /handler.php/ bla/foo" 并在 PHP 文件中将内容转储到文件中。它工作得很好。但是,我需要发送一些额外的信息,例如。带有上传文件请求的令牌。我想我应该使用 POST。
    • 令牌也可以在标头中;)
    • 这不能回答问题。 @AndreasJansson,你做了什么改变让它工作?我有同样的问题,并且说“你不需要做任何事情,它已经有效”没有帮助。
    • 我也有同样的问题。在到达 .php 页面之前发生 405 错误。所以我无法映射任何东西。
    • “只要确保请求映射到您的 PHP 文件” 对...但是如何?同意,不是一个有用的答案。
    【解决方案2】:

    AllowOverride AuthConfig

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


    此外,即使您没有找到解决 PUT 和 DELETE 问题的方法,也不要停止工作,而是使用“CORS”。这是一个 google chrome 应用程序,可以帮助您绕过问题,但请记住,这是一个临时解决方案,因此您的工作或实验不会长时间冻结。显然,您不能要求您的客户启用“CORS”来运行您的解决方案,因为这可能会危及系统安全。

    【讨论】:

    • 为什么您认为身份验证可能是根本原因,尽管所述问题是 405,而不是 403? CORS 与 HTTP 方法的可接受性或身份验证有什么关系?您能否澄清您的答案,以明确您在谈论这三个概念中的哪一个?
    【解决方案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 标准和浏览器开发人员的负担。

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

    希望有帮助

    【讨论】:

    • 你确定你的意思是“HTML”吗?
    • 好吧,no, it isn't
    • 点击我给你的链接。方法可以省略。它的默认值为GET
    • 没关系,反正;这个问题是关于返回错误代码的 HTTP 服务器,而不是关于 HTML 或 Ruby-on-Rails 或 REST 或您正在谈论的任何其他问题。 OP 甚至没有提到&lt;form&gt;
    • 这不是我的意见。我从字面上链接到标准文档大声笑
    【解决方案5】:

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

    简单地放置

    将不起作用,因为没有支持该方法的浏览器(并且它们会简单地默认为 GET,将 PUT 视为与处理 FDSFGS 之类的乱码一样) .遗憾的是,这些 HTTP 动词仅限于非桌面应用程序浏览器领域(即:Web 服务消费者)。

    【讨论】:

    • 他说他想要一个宁静的 API,所以它很可能与浏览器无关。无论如何,当前浏览器通过 XmlHttpRequest 支持 PUT、DELETE 等
    猜你喜欢
    • 2013-04-24
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2012-03-25
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多