条件位置路由-nginx

条件位置路由-nginx,nginx,webserver,Nginx,Webserver,问题: 我在一个域www.domain.com上有两个应用程序,由一个nginx1.5.5web服务器提供服务 因为它们都在同一个位置上侦听,所以我添加了APP=ONE或TWO的头,这是我在第一次调用应用程序时设置的。下面的例子 location ^/APPONE { proxy_pass http://APPONE; add_header APP ONE;

问题:

我在一个域www.domain.com上有两个应用程序,由一个nginx1.5.5web服务器提供服务

因为它们都在同一个位置上侦听,所以我添加了APP=ONE或TWO的头,这是我在第一次调用应用程序时设置的。下面的例子

location ^/APPONE  {
            proxy_pass http://APPONE;
                add_header              APP             ONE;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }

location ^/APPTWO  {
            proxy_pass http://APPTWO;
                add_header              APP             TWO;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }
location ~ ^/(framerwork1/|framerwork2/|framerwork3/) {
            proxy_pass http://APPONE;
                add_header              APP             ONE;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }

location ~ ^/(framerwork1/|framerwork2/|framerwork3/) {
                proxy_pass http://APPTWO;
                add_header              APP             TWO;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

  }
由于应用程序设计不佳,两个应用程序都请求以下位置,但未将应用程序名称用作docroot。就像下面的例子

location ^/APPONE  {
            proxy_pass http://APPONE;
                add_header              APP             ONE;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }

location ^/APPTWO  {
            proxy_pass http://APPTWO;
                add_header              APP             TWO;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }
location ~ ^/(framerwork1/|framerwork2/|framerwork3/) {
            proxy_pass http://APPONE;
                add_header              APP             ONE;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }

location ~ ^/(framerwork1/|framerwork2/|framerwork3/) {
                proxy_pass http://APPTWO;
                add_header              APP             TWO;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

  }
因此,我添加了appone或TWO头来分隔两者,但Nginx不接受我基于头代理它们的if语句。下面的例子

if ($http_host ~ 'APP=ONE') {

       location ~ ^/(framerwork1/|framerwork2/|framerwork3/) {
                proxy_pass http://APPONE;
                add_header              APP             ONE;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }

if ($http_host ~ 'APP=TWO') {

       location ~ ^/(framerwork1/|framerwork2/|framerwork3/) {
                proxy_pass http://APPTWO;
                add_header              APP             TWO;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }
问题:如何基于标头成功代理这两个应用程序?请注意,我无法使用其他服务器块或域。它们一定是一样的


提前感谢。

好的,有人请求访问www.domain.com/APPONE。您不能确切地说出通过URL www.domain.com/framerwork1/请求的内容,但让我们想象一下,这是一个图像,是/APPONE提供的页面所需要的,因为这很容易理解

当您通过“add_header”设置头时,它将在Client->Nginx->PHP Proxy中的第二个数组中设置

当客户端在www.domain.com/framerwork1/上向映像发出请求时,它不知道您希望设置一个头,以便能够确定映像是由APPONE请求的,还是其他什么

即使您在www.domain.com/APPONE客户机的响应上设置了头,也不要盲目地将发送给它们的头回显到服务器以供后续请求


或者直截了当地说,我认为您误解了头的传递位置,并且实际上没有办法确定哪个应用程序向/framerwork1/URL发出这样的请求。您必须通过单独的域名或子域或在应用程序内部执行此操作,例如查看用户登录的应用程序。

请澄清,设置add_header APP ONE;,您希望会发生什么@Danack说它将添加一个头变量,我可以使用它进行过滤。这样做是错误的吗?在向/APPONE发出的请求中,标头将添加到代理服务器的请求中,客户端不会在以后向位置/framerwork1发出的请求中设置标头。@Danack为什么?当然,通过代理的任何请求都会添加头?这不对吗?