nginx中多个FastCGI ASP.NET单声道后端的版本化URL

我计划在nginx后面有多个运行FastCGI的ASP.NET应用程序。

这些多个应用程序的二进制文件不同,我希望nginx根据它们的URI将请求转发到相应的ASP.NET应用程序。

单声道应用程序本身始终在根path"/"上进行侦听。 我假设我将不得不修改位置指令和fastcgi_params,但我不知道哪些fastcgi_params我必须改变,以使其工作。

示例用例:

  • 应该将http://www.server.com/api/1/status转发到在TCP端口9000上运行的FastCGI应用程序,请求URI应该被重写为/status
  • http://www.server.com/api/2/status应该被转发到运行在TCP端口9001上的FastCGI应用程序,请求URI也应该被重写为/status以匹配ASP.NET侦听器configuration。

转发到FastCGI时,URI的/ api / {version}部分应该被删除。

我尝试了这个nginxconfiguration,ASP.NET通过FastCGI调用,但是无法处理请求:

 location ~ /api/1/(.*) { root /usr/aspnet/; fastcgi_pass 127.0.0.1:9000; include /etc/nginx/nginx-fastcgi-params.conf; fastcgi_param REQUEST_URI /$1; } 

我不知道是否我的方法与位置指令是完全正确的,有什么想法?

/编辑:这是我想出的解决scheme。 显然不需要其他的fastcgi_params:

 location ~ ^/api/1/(.*)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param SCRIPT_NAME /$1; } 

除非您确切地知道控制器正在使用哪个fastcgi_param参数,否则您应该控制它们并将/etc/nginx/nginx-fastcgi-params.conf的内容粘贴到位置容器中,而不是将其包含在文件中,至少直到您让这一切工作。

您可能还需要修改SCRIPT_NAMEDOCUMENT_URI

你的位置正则表达式应该以^和前缀$为前缀来消除任何不明确的地方(与手头的问题没有任何关系)。