TL;DR
前回はこちらから。
参考書はこちらです。
今回はgeoディレクティブを使ってアクセス元のIPを判別し、その結果によってURLを書き換えて表示内容を変更するということをやっていきたいと思います。
環境
今回のゴール
以下のように表示内容が変わることを確認します。
表示内容は条件分岐によって以下の2パターンに分けます。


geoディレクティブを設定する
geoディレクティブを使うと、クライアントのIPアドレスを判定して変数に値を入れてくれます。
ただし、geoディレクティブはserverコンテキストには書けず、httpコンテキストに書く必要があります。
geo $from {
default external;
172.20.0.1 local;
}
私のDocker環境でブラウザからアクセスした場合のIPアドレスは、172.20.0.1となるので今回はそのIPアドレスでアクセスされた場合は$fromという変数にlocalが代入されるようにしています。
rewriteの記述
rewriteディレクティブを使うと、nginxが受け取ったリクエストURLを書き換えることが可能です。
この時クライアントに見せるURLはそのままで、別のURLにアクセスしたかのような内容を返します。
rewriteにはフラグという書き換えの設定オプションが存在し、書き換え設定しない場合を含めた5種類の設定が可能です。
今回フラグについては説明しません。
フラグについてはこちらのサイトを参照ください。
今回はこのrewriteを以下のように設定します。
server {
~省略~
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice;
location / {
~省略~
# 条件に一致した場合、/hogeというパスを/rewriteというパスに置き換える
if ($from = docker){
rewrite ^/hoge/rewrite.html /rewrite/rewrite.html;
}
root /framework/www/html;
index index.html;
}
}
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice;
ですが、これを記述した場合エラーログにrewriteでの書き換え情報を出力してくれます。
また、rewrite ^/hoge/rewrite.html /rewrite/rewrite.html;はfromの変数にセットされた内容がdockerである場合に、末尾が/hoge/rewrite.htmlというURLが来たら、/rewrite/rewrite.htmlに書き換えるということが起こります。
確認用のHTMLを準備する
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
It not rewrited!
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
It rewrited!
</body>
</html>
一度動作を確認
今の状態でhttp://127.0.0.1:8080/hoge/rewrite.htmlへアクセスした場合、$fromはlocationとなっておりrewriteは発生しません。
よって、表示内容は以下のようになります。

geoディレクティブを修正
ではここでgeoディレクティブの内容を修正します。
geo $from {
default external;
172.20.0.1 docker;
# 172.20.0.1 local;
}
localではなくdockerをセットするようにします。
これによりrewriteが発生し、表示内容が変わることを確認します。
設定ファイルを書き換えたのでnginxを再起動して確認します。
設定変更後、確認
先ほどと同じくhttp://127.0.0.1:8080/hoge/rewrite.htmlへアクセスします。

今度はrewriteが発生し、表示内容がIt rewrited!に変わりました。
書き換えられたことはログを確認することでもわかります。
2022/10/10 07:22:59 [notice] 499#0: *1 "^/hoge/rewrite.html" matches "/hoge/rewrite.html", client: 172.20.0.1, server: example.com, request: "GET /hoge/rewrite.html HTTP/1.1", host: "127.0.0.1:8080"
2022/10/10 07:22:59 [notice] 499#0: *1 rewritten data: "/rewrite/rewrite.html", args: "", client: 172.20.0.1, server: example.com, request: "GET /hoge/rewrite.html HTTP/1.1", host: "127.0.0.1:8080"
^/hoge/rewrite.htmlが/hoge/rewrite.htmlにマッチして、/rewrite/rewrite.htmlに書き換えられたことが読み取れますね。