Nginx代理或重写取决于用户代理

use*_*200 14 configuration user-agent nginx

我是nginx的新手,从apache开始,我基本上想做以下事情:

基于用户代理:iPhone:重定向到iphone.mydomain.com

android:重定向到android.mydomain.com

facebook:反向代理到otherdomain.com

所有其他:重定向到...

并尝试以下方式:

location /tvoice {
   if ($http_user_agent ~ iPhone ) {
    rewrite     ^(.*)   https://m.domain1.com$1 permanent;
   }
   ...
   if ($http_user_agent ~ facebookexternalhit) {
    proxy_pass         http://mydomain.com/api;
   }

   rewrite     /tvoice/(.*)   http://mydomain.com/#!tvoice/$1 permanent;
}
Run Code Online (Sandbox Code Playgroud)

但是现在我在启动nginx时遇到错误:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except"
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做或问题是什么.

谢谢

kol*_*ack 18

proxy_pass目标的'/ api'部分是错误消息所指的URI部分.由于ifs是伪位置,而带有uri部分的proxy_pass用给定的uri替换匹配的位置,因此if中不允许使用它.如果你只是颠倒那个逻辑,你可以让它工作:

location /tvoice {
  if ($http_user_agent ~ iPhone ) {
    # return 301 is preferable to a rewrite when you're not actually rewriting anything
    return 301 https://m.domain1.com$request_uri;

    # if you're on an older version of nginx that doesn't support the above syntax,
    # this rewrite is preferred over your original one:
    # rewrite ^ https://m.domain.com$request_uri? permanent;
  }

  ...

  if ($http_user_agent !~ facebookexternalhit) {
    rewrite ^/tvoice/(.*) http://mydomain.com/#!tvoice/$1 permanent;
  }

  proxy_pass         http://mydomain.com/api;
}
Run Code Online (Sandbox Code Playgroud)