2013-03-12 1009 views
0

我正在使用nginx进行PHP REST API工作。为了完全恢复,我在适当时使用PUT/DELETE请求。但是,PHP不会解析PUT请求中的帖子正文 - 这是我需要的特定场景。Nginx将请求从PUT改为POST

我曾经考虑过自己解析它,但是a)我宁愿让PHP在C中执行它,因为它比我能在PHP中实现的任何实现都快得多,并且b)有很多边缘情况下的人已经花了很多时间在工作 - 我宁愿不重复这些努力。

在API方面,我已经添加了支持来阅读X-HTTP-Method-Override标题,并在实际动词中使用该标题。

我正在寻找的所有内容都是在nginx中采取PUT请求的方法,并将其更改为带有该标头集的POST请求。

我觉得ike我已经找遍了所有的地方,但找不到解决方案。任何事情都会有帮助(即使你推荐不同的解析技术,所以我不必处理这个问题)。

回答

1

Nginx只通过REQUEST_METHOD参数告知FastCGI的请求方法。所以你可以简单地覆盖这个值并向PHP报告任何你想要的东西。你必须声明另一个变量的Nginx的配置,让我们将其命名为$fcgi_method,在原有基础上请求方法:

map $request_method $fcgi_method { 
    default $request_method; 
    PUT POST; 
} 

(注意map部分应在http水平,即相同的配置水平server块)

然后你可以用它在你的位置,就像这样:

fastcgi_param REQUEST_METHOD $fcgi_method; 

重要的是,这个片段是典型的后include fastcgi_params或类似。

+0

哇 - 你是绝对正确的。这是我从Apache的世界中获得的。 – 2013-03-12 13:16:37

+0

这不起作用:nginx:[emerg]“fastcgi_param”指令在/ etc/nginx/sites-enabled/xxxxx中不允许:x – Philio 2014-09-21 16:07:11

+0

@Philio哦,你是对的。我已经更正了答案 – 2014-09-23 15:41:51

0

我认为值得指出的是,如果其他人认为这种方法在PHP中处理PUT请求(或任何其他请求方法未填充到某个全局$ _WHATEVER数组中以使生活变得轻松),那么正确的方法得到一个放入请求的正文是读取php://input的内容。

像这样的东西应该工作:

$data = file_get_contents("php://input");