Nginxのlocationディレクティブでif文を使う時、phpとかのようにANDやORみたいな条件式を書くことができません。
擬似的にそれっぽく実装できた方法を書いておきます。
この記事のコンテンツ
ORの条件分岐でやりたいこと
やりたかったのは「特定のリファラ(複数存在)からのアクセス以外は404」みたいな処理。
phpでいうところの
if ( $hoge == 'hoge' || $fuga == 'fuga' ) {
// 処理
}
こんな分岐ができたらいいんですが……。
まともに書いてもダメそうなので、ここの記事を参考に亜種を作ってみました。
実際に動かしてみた
どこかのディレクティブにこんな感じで書けば動くんじゃないかな、多分。
set $check_referer false;
# リファラで許可するホストhogehoge.com
if ($http_referer ~ https?://hogehoge.com/(.*?)) {
set $check_referer true;
}
# リファラで許可するホストfugafuga.jp
if ($http_referer ~ https?://fugafuga.jp/(.*?)) {
set $check_referer true;
}
# リファラがhogehoge.comかfugafuga.jpでなければrewrite
if ($check_referer = false) {
rewrite / permanent;
}
上書きしたらNginxのリロードは忘れずに。
一応やりたい動作は実現できたっぽいです。
さいごに
そもそもlocationディレクティブでif文は悪だと言われてる中で、容赦無くif文を連打してるあたり気持ち悪い書き方ですね。
こうでもしないとやりたいことが実現できなかったんだから仕方ない。