REST をサポートしたデバイスで、個別 URL への削除は許可しますが、上位 URL への削除は禁止する必要がありました。Nginx をリバースプロキシとして使って実現することができたので、その際のメモです。
まず達成したいことはこんな感じです。
下記のような個別の URL への DLETE は許可します。
http://127.0.0.1:8080/api/running/services/bgpmgr/test1
http://127.0.0.1:8080/api/running/services/bgpmgr/test2
...
しかし次のように、上位の URL に対する DELETE は禁止します。
http://127.0.0.1:8080/api/running/services
Nginx の設定
Nginx は基本的に上から評価するため、個別 URL はそのまま pass し、それ以外は GET のみ許可するようにしてみます。nginx.conf は下記ような感じ。
events {
worker_connections 1024;
}
http {
server {
listen 9000;
server_name localhost;
location /api/running/services/bgpmgr {
# Device URL
proxy_pass http://127.0.0.1:8080/api/running/services/bgpmgr;
}
location / {
limit_except GET {
deny all;
}
# Device URL
proxy_pass http://127.0.0.1:8080/;
}
}
}
上記設定後、Nginx を起動します(すでに起動している場合は "nginx -s reload")。
$ nginx -p . -c nginx.conf
動作結果
オリジナルのデバイスのポート 8080 の代わりに Nginx の 9000 に対して REST message を投げます。
$ curl http://127.0.0.1:9000/api/running/services -X DELETE
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.6.2</center>
</body>
</html>
$
上位 URL は無事にフィルタされました。
$ curl http://127.0.0.1:9000/api/running/services/bgpmgr/test1 -X DELETE
$
個別 URL は問題なく削除できます。
あとは、必要に応じてエラー処理などを実装して行けば良さそうです。