web-dev-qa-db-ja.com

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;
}

しかし今、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"

そして、私はそれを行う方法や何が問題なのかわかりません。

ありがとう

14
user984200

Proxy_passターゲットの「/ api」部分は、エラーメッセージが参照しているURI部分です。 ifsは疑似位置であり、uri部分を持つproxy_passは一致した位置を指定されたuriに置き換えますので、ifでは許可されていません。 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;
}
18
kolbyjack