将Nginx请求从PUT改为POST

4
我正在使用nginx开发PHP REST API。为了使其完全符合RESTful的要求,我在适当的情况下使用PUT/DELETE请求。但是,对于PUT请求,PHP无法解析post body——而我在这种特定情况下需要它。
我曾考虑自己解析,但是a)我宁愿让PHP用C语言解析,因为比我自己实现的任何方法都要快得多;b)已经有许多人花费了大量时间处理边缘情况——我不想再重复这些努力。
在API方面,我已经添加了读取X-HTTP-Method-Override头并在可用时使用该头代替实际动词的支持。
现在我所需要的只是一种方法,在nginx中采用一个PUT请求,并将其更改为一个具有该标头设置的POST请求。
我感觉我已经到处查找但没有找到解决方案。任何帮助都将非常有用(即使您建议使用不同的解析技术,以便我无需处理此问题)。
2个回答

3

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或类似的代码之后。


哇 - 你说得完全正确。这就是我从Apache世界来的结果。 - Colin M
这个不起作用:nginx: [emerg] 在 /etc/nginx/sites-enabled/xxxxx:x 中,"fastcgi_param" 指令在此处不允许。 - Philio
@Philio 哦,你说得对。我已经更正了答案。 - Alexander Azarov
这可能是更好的方法,尽管在阅读问题后(我是在寻找一种让Nginx识别X-HTTP-Method-Override头的方法时发现的),这可能是对首先明显的编程错误的极其hacky的解决方案。PHP没有问题获取PUT请求的正文。 - Philio
@Philio 通过评论或回答告诉原帖作者。 - Alexander Azarov

0

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

像这样的东西应该可以工作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接