Linux Webサーバー インフラ

Rocky Linuxにnginxをインストールしていじっていく 〜rewriteでURLの書き換え編〜

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に書き換えられたことが読み取れますね。

直近の推し5選!

1

みなさんこんばんは。 こんにちは、Kanon です。今回は… しめさば先生の『君は僕の後悔』の感想記事です。 しめさば先生はこれまでにも『ひげを剃る。そして女子高生を拾う』や『きみは本当に僕の天使なの ...

2

リンク あらすじ 人生オール80点。 そんな俺が託されたのは、元トップアイドル・香澄ミルの世話だった。 ファン対応がしみつきなかなかクラスに馴染めないミル。 そんな彼女に頼られるうち、俺たちは図らずも ...

3

リンク 二丸先生の他の作品はこちら あらすじ 記憶喪失の湖西廻の前に現れたのは、清純で素朴な美少女、丹沢白雪。 「──私、廻くんと恋人だったの」  白雪はそう言って顔を赤らめ、廻の頬にキスをする。   ...

4

リンク あらすじ その夜、僕の青春は〈炎〉とともに産声をあげた――  スマホを忘れて夜の学校に忍び込んだ在原有葉(ありはらあるは)は、屋上を照らす奇妙な光に気づく。そこで出会ったのは、闇夜の中で燃え上 ...

5

こんにちは、Kanon です。今回は… しめさば先生の『きみは本当に僕の天使なのか』の感想記事です。 表紙とタイトルを見るに幻想的な恋の話のように思えるのですが、実はタイトルはそんな幻のようなものでは ...

-Linux, Webサーバー, インフラ
-, , , , , , , , , ,