Вопрос по nginx, configuration – Nginx прокси или переписать в зависимости от агента пользователя

13

я новичок в 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;
}

Но теперь я получаю сообщение об ошибке при запуске 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"

И я не понимаю, как это сделать или в чем проблема.

Спасибо

Ваш Ответ

1   ответ
18

«/ Api» часть цели proxy_pass - это часть URI, на которую ссылается сообщение об ошибке. Так как if являются псевдоположениями, а proxy_pass с частью uri заменяет сопоставленное местоположение заданным 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;
}

Похожие вопросы