Nginx代理按请求方法

是否有可能/如何configuration一个Nginx位置块代理不同的后端取决于请求方法(即GET / POST)?

原因是,我目前正在处理2个方法在2个不同的URL(一个通过http代理,另一个通过fcgi),并试图使其更加“rest”,所以,理想情况下,将获得资源返回列表而POSTing到相同的资源应该添加到列表中。

我不使用这个configuration,但基于这里的例子 :

location /service { if ($request_method = POST ) { fastcgi_pass 127.0.0.1:1234; } if ($request_method = GET ) { alias /path/to/files; } 

}

如果你编写自己的应用程序,你也可以考虑检查GET / POST,并发送X-Accel-Redirect头文件将文件传输到nginx。

虽然你可以用if来达到这个目的,但Nginx的文档通常不鼓励 if做,因为if与其他指令不兼容的话。 例如,假设GET应该为所有人开放,而POST仅用于通过身份validation的用户,使用HTTP基本身份validation。 这将需要ifauth_basic ,这不正常工作。

这是一个替代, if没有工作。 诀窍是使用“GET”和“POST”作为上游名称的一部分,所以可以简单地通过使用variablesreplace来解决这些问题:

 http { upstream other_GET { server ...; } upstream other_POST { server ...; } server { location /service { proxy_pass http://other_$request_method; } } } 

要将GET和HTTP Basic Auth结合使用,只需添加一个limit_except块:

  ... location /service { proxy_pass http://other_$request_method; limit_except GET { auth_basic ...; } } ...