İstek Yöntemi ile Nginx proxy'si


17

Mümkün mü? / Bir Nginx konum bloğunu istek yöntemine (ör. GET / POST) bağlı olarak farklı arka uçlara proxy yapacak şekilde nasıl yapılandırabilirim?

Bunun nedeni, şu anda 2 farklı URL'de (biri http proxy ve diğeri fcgi üzerinden) 2 yöntemi kullanıyorum ve daha "REST" ful yapmaya çalışıyorum, ideal olarak listeyi döndürmek için kaynak ALMAK istiyorum , aynı kaynağa POSTing işlemi listeye eklenmelidir.

Yanıtlar:


27

Bu yapılandırmayı kullanmıyorum, ancak buradaki örneklere dayanarak :

location /service  {
  if ($request_method = POST ) {
    fastcgi_pass 127.0.0.1:1234;
  }

  if ($request_method = GET ) {
     alias /path/to/files;
  }
}

Kendi uygulamanızı yazıyorsanız, içindeki GET / POST'u kontrol etmeyi ve dosyaların nginx'e taşınmasını sağlamak için X-Accel-Redirect üstbilgilerini göndermeyi de düşünebilirsiniz .


GET bloğu benim durumumda bir proxy_pass, ancak aksi takdirde çalışır. Şu anda ikinci if bloğunu kullanmıyorum, fastcgi_pass yönergesine ulaşıldığında nginx "işlemeyi" durduruyor gibi görünüyor (POST dışında başka bir şeyin geri dönmesini istemiyorum) vekil.
Brenton Alker

2
Bunun ifgenellikle Nginx belgeleri tarafından önerilmediğini unutmayın : nginx.com/resources/wiki/start/topics/depth/ifisevil
vog

1
Yani alternatif nedir?
WM

1
@WM Cevabımı gör: serverfault.com/a/823053/175421
vog

@vog, İlginç. Bunu yapmanın oldukça akıllı yolu. Paylaşım için teşekkürler.
WM

23

Bunu başarabilmenize rağmen if, bu genellikle Nginx belgeleri tarafından önerilmez , çünkü ifdiğer direktiflerle iyi oynamaz. Örneğin, POST yalnızca kimliği doğrulanmış kullanıcılar için HTTP Temel Yetkilendirme kullanan GET'in herkes için açık olması gerektiğini varsayalım. Bunun ifile birleştirilmesi gerekir auth_basic, ki bu düzgün çalışmaz.

İşte olmadan çalışan bir alternatif if. İşin püf noktası, "GET" ve "POST" öğelerini yukarı akış adlarının bir parçası olarak kullanmaktır, böylece bunlar değişken ikameyle ele alınabilir:

http {
  upstream other_GET {
    server ...;
  }
  upstream other_POST {
    server ...;
  }
  server {
    location /service {
      proxy_pass http://other_$request_method;
    }
  }
}

Bunu GET dışında her şey için HTTP Temel Kimlik Doğrulaması ile birleştirmek için bir limit_exceptblok eklemeniz yeterlidir:

  ...
    location /service {
      proxy_pass http://other_$request_method;
      limit_except GET {
        auth_basic ...;
      }
    }
  ...

Bu yaklaşımdaki sorun biz dönecektir artık 502 gateway errorçünkü no resolver defined to resolve other_HEAD(ya da her türlü sizin memba olan kayıp). Gibi bir şeyi iade etmek daha semantik olacaktır 405 method not allowed. Bunu başarmanın bir yolu var mı?
James

1
@James: Bu belki de yeni bir soru olarak ifade edilebilir, buna atıfta bulunulur. Bu ayrıntı için bir cevabım yok, ama belki başkaları için.
vog

0

İşlerin benim için çalışmasını sağlamak için yaptığım şey bu

add_header Allow "GET, POST, HEAD" always;
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
    proxy_pass http://back-end;
}

Çapa tam olarak istek yöntemine göre iki uç nokta arasında geçiş yapıyor mu?
Temel

0

OPTIONS, PUT vb. Gibi diğer yöntemler için varsayılan bir işleyici içerecek şekilde vog yanıtında hafif bir değişiklik yapın.

    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;
            }
    }

0

Çalışmak için @ timmmmmy'den cevap alamadım, ancak harita belgelerine işaret etti ve bu benim için çalıştı:

map $request_method $upstream_location {
   PUT     example.com:8081;
   POST    example.com:8081;
   PATCH   example.com:8081;
   default example.com:8082;
}
server {
   location / {
      proxy_pass https://$upstream_location;
   }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.