こんなトリッキーなことしないほうが良い気もするけど。
ソース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/; } }