nginxで特定の条件(ソースIPなど)の場合のみreverse proxyとして動作させる設定

こんなトリッキーなことしないほうが良い気もするけど。

ソースIPの指定はif $remote_addr で正規表現で書いてもいいけど、複数あると煩雑になるのでgeo使ったほうが楽ですね。

気をつけないといけないのはifのの中などでproxy_passを指定する場合は
URLの指定ができない(末尾に"/"つけてはいけない)ので設定を間違えるとエラーになること。

# nginx.conf
http {
# 略
  geo $hoge  {
    default        0;
    192.0.1.1      1;
    192.0.2.0/24   1;
  }
	
  include vhosts.conf;
}
	
# vhosts.conf
server {
  server_name example.com;
  root /var/www/html;
  # 略

  location /hoge/ {
    proxy_set_header X-Forwarded-Host $host;
    if ($hoge) {
      proxy_pass http://localhost:8080;
    }
  }
}


気をつけないといけないのはifのの中などでproxy_passを指定する場合は、URLの指定ができない(末尾に"/"つけてはいけない)ので設定を間違えるとエラーになること。

  location /hoge/ {
    proxy_set_header X-Forwarded-Host $host;
    if ($hoge) {
      proxy_pass http://localhost:8080/;
    }
  }
||<	
>||
# nginx -t
nginx: [emerg] "proxy_pass" may not have URI part in location given by regular expression, 
or inside named location, or inside the "if" statement, or inside the "limit_except" block 
in /etc/nginx/vhosts/sample.conf:27
nginx: configuration file /etc/nginx/nginx.conf test failed

なのでreverse proxyに投げるURLを変えたい場合はproxy_passの前に、rewriteを使ってURL変えないといけない。

  location /hoge/ {
    proxy_set_header X-Forwarded-Host $host;
    if ($hoge) {
      rewrite /hoge/(.*) /foo/$1 break;
      proxy_pass http://localhost:8080/;
    }
  }