このブログはWordPressテーマ「THE SONIC」を使用しています

Nginxのif文でOR的な条件を実現してみた

1 min

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文を連打してるあたり気持ち悪い書き方ですね。

こうでもしないとやりたいことが実現できなかったんだから仕方ない。

関連記事
はるしか

はるしか

ゲーム・漫画・アニメ・クルマ・ガジェットなど多趣味な雑食系で、わからないこと・気になることがあればすぐ調べないと気が済まないタイプ。
集めた知識を独自の観点でお伝えしていきます。

FOLLOW

カテゴリー:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です