回答:
location /service {
if ($request_method = POST ) {
fastcgi_pass 127.0.0.1:1234;
}
if ($request_method = GET ) {
alias /path/to/files;
}
}
独自のアプリケーションを作成する場合、GET / POSTをチェックし、X-Accel-Redirectヘッダーを送信してファイルの転送をnginxに渡すことも検討できます。
if
:一般的にnginxのドキュメントで推奨されてnginx.com/resources/wiki/start/topics/depth/ifisevil
でこれを達成することはできますがif
、これは一般にNginxのドキュメントでは推奨されてif
いません。他のディレクティブではうまく動作しないからです。たとえば、GETはすべてのユーザーに対して開かれ、POSTはHTTP基本認証を使用する認証されたユーザーのみに対して開かれると仮定します。これは、if
と組み合わせて使用する必要がありますがauth_basic
、正しく機能しません。
なしで機能する代替手段を次に示しif
ます。コツは、アップストリーム名の一部として「GET」と「POST」を使用することです。したがって、これらは変数置換によって対処できます。
http {
upstream other_GET {
server ...;
}
upstream other_POST {
server ...;
}
server {
location /service {
proxy_pass http://other_$request_method;
}
}
}
GET以外のすべてについてHTTP Basic Authとこれを組み合わせるには、limit_except
ブロックを追加するだけです:
...
location /service {
proxy_pass http://other_$request_method;
limit_except GET {
auth_basic ...;
}
}
...
502 gateway error
、no resolver defined to resolve other_HEAD
(または、不足しているアップストリームが何であれ)戻ってくることです。のようなものを返す方がより意味があります405 method not allowed
。これを達成する方法はありますか?
OPTIONS、PUTなどの他のメソッドのデフォルトハンドラーを含めるために、vogの回答が若干変更されました。
upstream webdav_default {
server example.com;
}
upstream webdav_upload {
server example.com:8081;
}
upstream webdav_download {
server example.com:8082;
}
server {
map upstream_location $request_method {
GET webdav_download;
HEAD webdav_download;
PUT webdav_upload;
LOCK webdav_upload;
default webdav_default;
}
location / {
proxy_pass https://$upstream_location;
}
}