and/or 条件が面倒くさいパターン。nginx で特定ネイティブアプリから来た場合は素通しして、その他は拒否する。ただし特定の IP からのアクセスは Basic 認証で許可する様な謎要件。
つまりはこう言うこと。
- 特定ネイティブクライアント:
- どこから接続に来ても OK
- 特定 IP からのアクセス:
- 特定ネイティブクライアントだったら素通し
- その他(ブラウザとか)だったら basic 認証出す
- その他:
- 有無を言わさず拒否
server {
# ~~~ snip ~~~
# Access check
set $invalid_access 1;
set $need_auth_basic "Restricted";
## allow IPs
if ($remote_addr = "XXX.XXXX.XXX.XXX") {
set $invalid_access 0;
set $need_auth_basic "Restricted";
}
## Native Client app
if ($http_user_agent ~* (ownCloud-iOS|ownCloud-android|mirall) ) {
set $invalid_access 0;
set $need_auth_basic off;
}
if ($invalid_access) {
return 403;
}
# ~~~ snip ~~~
location / {
# auth
auth_basic $need_auth_basic;
auth_basic_user_file /etc/nginx/.htpasswd;
# ~~~ snip ~~~
}
}
この例では $remote_addr
や $http_user_agent
で制御している。偽装は難しくないだろうから気休め程度の抑止力。
とは言え nginx は割とこういった事が直感的に実装できて良い。