web-dev-qa-db-ja.com

nginx confでif / elseステートメントを行う方法は?

nginxでこのようなことをすることは可能ですか?

if ( $http_user_agent = "wget" ){
   server {
      listen      11.11.11.11:1111;
      root        /website1/;
      server_name example.com www.example.com;
else 

   server {
      listen      22.22.22.22:22222;
      root        /website2/;
      server_name example2.com www.example2.com;
}
9
user421936

Nginx書き換えモジュールには ifディレクティブ (例についてはリンクされたドキュメントを参照)がありますが、elseはありません。 elseに相当するものはifで変更されないものすべてです。

ifserver { }内で使用できますが、逆は使用できません。すでにサーバーを必要とするリクエストの前にifで条件を比較することすらありません。そこでは、ユーザーエージェントがwgetである(またはそうでない)場合にのみコンテンツを提供できます。

また、iflocation内で使用しないでください。これは、期待どおりに機能しない可能性があるためです( If Is Evil を参照)。

9
Esa Jokinen

指定された形式では機能しません。HTTPUser-Agentをテストすると、要求がすでに受信されていることが暗示されます。これは、一部のserverブロックがすでに定義されている場合にのみ可能です。別の場所で受け取ったリクエストのUser-Agent文字列に応じて、本当に新しいサーバーを起動しますか?

異なるコンテンツを提供するだけの場合は、User-Agentなどのリクエストの部分に応じて、異なるパスなどにリダイレクトします。これは可能です。 http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

3
Stefan Moch