(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【NGINX/Linux】特定の文字列が入ったリクエストをエラーにする

スポンサーリンク

やりたいこと

リクエストの中で指定されるURLの中に指定した文字列が入っていた場合にエラー処理を行う。
例としてAmazon Linuxにて検証を行い、"a"という文字列が入っていた場合に応答コード400でエラーとする。

環境情報
# nginx -v
nginx version: nginx/1.25.1 (nginx-plus-r30-p1)

やり方

mapディレクティブにて特定のリクエストとして"a"が含まれる場合の設定を行い

http {
...
    map $request_uri $invalid_uri {
    default 0;
    "~*a" 1;
    }
...

その条件の場合のエラーコードを記載する。

server {
...
if ($invalid_uri) {
return 400;
}
...

実際にaという文字列が含まれているアクセスは以下のようなエラーとなる。

$ curl http://localhost/sample/ -I
HTTP/1.1 400 Bad Request
Server: nginx/1.25.3
...
Content-Type: text/html
Content-Length: 157
Connection: close

以下、補足です。

補足

参考までに掲載しますが以下のサンプル設定で動作検証を行いました。

user  nginx;
worker_processes  auto;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    map $request_uri $invalid_uri {
    default 0;
    "~*a" 1;
    }
server {
    listen 80;
    root /usr/share/nginx/html;
    if ($invalid_uri) {
        return 400;
        }
    }
sendfile on;
keepalive_timeout 60;
}

コンテンツを配置した上で

# tree /usr/share/nginx/html/
/usr/share/nginx/html/
├── index.html
├── sample
│   └── index.html
└── test
    └── index.html

"a"という文字列が入っていない場合は問題なく応答が返ってきますが

# curl http://localhost/test/ -I
HTTP/1.1 200 OK
...

"a"が入っているリクエストは全て設定ファイルに記載した400となります。

ちなみにコンテンツが入っていない場所へのリクエストも一般的には404 Not Foundとなりますが、条件に合致する場合はこれらの応答も設定ファイルに記載した応答となります。

以上、ご参考になれば幸いです。