私は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"
そして、私はそれを行う方法や何が問題なのかわかりません。
ありがとう
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;
}