---
title: "アクセスを拒否する"
language: "ja"
documentation_version: "3.x"
channel: "development"
release_context: null
source_revision: "10297d1e28653321d6996609fc53718d3b7c8278"
working_tree_clean: true
source_path: "docs/ja/guides/access-control.md"
source_sha256: "c54f6ab6944a45d4b0ce1fcfce1aadb4462bb21d5d7cc4b734852940185cd0fc"
source_at_revision: true
source_url: "https://github.com/matsumotory/ngx_mruby/blob/10297d1e28653321d6996609fc53718d3b7c8278/docs/ja/guides/access-control.md"
html_url: "https://ngx.mruby.org/ja/guides/access-control/"
markdown_url: "https://ngx.mruby.org/markdown/ja/guides/access-control.md"
last_updated: "2026-10-29"
---

# アクセスを拒否する

accessハンドラは、locationのcontentの前に、nginxのaccessフェーズで動きます。そこで動くスクリプトは、403のようなステータスでリクエストを終えるか、ステータスを設定せずに戻ってリクエストを先へ進めます。詳しくは[`mruby_access_handler`](/ja/reference/directives/#mruby_access_handler-and-mruby_access_handler_code)にあります。このガイドでは、ファイルに載せたクライアントを、accessハンドラで拒否します。

## サンプル

accessハンドラは、変数`$deny_list`が指すファイルを読み、クライアントのアドレスがファイルの行のどれかと同じなら403を返します。location`/listed/`が指すリストには、テストのクライアントのアドレスである`127.0.0.1`があるので、リクエストは403になります。nginxは、`error_page 403 @denied`に従って、その403にボディを付けます。location`/open/`が指すリストには、そのアドレスがありません。

```nginx title="test/conf/conf.d/74-guide-access.conf"
server {
    listen 18162;
    default_type text/plain;
    error_page 403 @denied;

    # The list of this location holds 127.0.0.1, the address of the case.
    location /listed/ {
        set $deny_list build/nginx/html/guide_access_listed.txt;
        mruby_access_handler build/nginx/html/guide_access.rb;
        mruby_content_handler_code 'Nginx.rputs "welcome\n"';
    }

    # The list of this location does not hold it.
    location /open/ {
        set $deny_list build/nginx/html/guide_access_open.txt;
        mruby_access_handler build/nginx/html/guide_access.rb;
        mruby_content_handler_code 'Nginx.rputs "welcome\n"';
    }

    location @denied {
        return 403 "your address is on the deny list\n";
    }
}
```

```ruby title="test/html/guide_access.rb"
r = Nginx::Request.new
path = r.var.deny_list
listed = File.exist?(path) && File.read(path).split("\n").include?(r.var.remote_addr)
Nginx.return Nginx::HTTP_FORBIDDEN if listed
```

```http title="test/html/guide_access.request：ケースが送るリクエスト"
GET /listed/report HTTP/1.1
Host: 127.0.0.1:18162
Connection: close
```

```http title="test/html/guide_access.response：ケースが比べるレスポンス"
HTTP/1.1 403 Forbidden
Content-Type: text/plain

your address is on the deny list
```

<p class="caption sample-caption">CIが動くたびに、ケースの<code>test/t/cases/guides.rb</code>がこのリクエストを送ります。ケースは、ステータス行、ここに載せたヘッダ、ボディ全体を比べます。<span class="nowrap">5個</span>のファイルを最後に変えたのは、<span class="nowrap">2026-10-29</span>のコミット<span class="nowrap"><code>32219e53</code>です。</span></p>

ケースは`GET /open/report`も送って、ボディが`welcome`の200を期待します。

## 気をつけること

- スクリプトはリクエストのたびにリストのファイルを読むので、ディスクが答えるまでワーカーをブロックします。ワーカーごとに1回だけ読むには、`mruby_init_worker_code`でリストを定数に読み込み、ファイルを変えたらnginxをリロードしてください。詳しくは[ワーカーがリクエストをまたいで保つもの](/ja/concepts/lifetimes/#ワーカーがリクエストをまたいで保つもの)にあります。
- `r.var.remote_addr`の値は、TCPの接続相手のアドレスです。ロードバランサの後ろでは、nginxのrealipモジュールがロードバランサの送るヘッダからアドレスを設定しない限り、そのロードバランサのアドレスになります。
- `Nginx.return Nginx::HTTP_FORBIDDEN`はステータス403でリクエストを終えます。`Nginx.return`を呼ばずに戻るスクリプトでは、nginxはaccessフェーズの次のハンドラを実行し、その後contentへ進みます。
