web-dev-qa-db-ja.com

nginxを使用して、特定のユーザーエージェントに異なるファイルを提供します

Nginxを使用して、さまざまなユーザーエージェントにさまざまな静的ファイルをどのように提供しますか?たとえば、現在のユーザーがiPhoneを使用している場合は、サービスを提供する必要がありますmobile_index.html、他のすべてのユーザーエージェントはbrowser_index.html

見つかった解決策:

server {
  listen 80;
  root /var/www;

  set $mobile_request '0';
  if ($http_user_agent ~ 'iPhone') {
    set $mobile_request '1';
  }

  location =/ {
    if ($mobile_request = '1') {
      rewrite ^ /mobile_index.html;
    }
    if ($mobile_request = '0') {
      rewrite ^ /browser_index.html;
    }
  }
}
7
summatix

十分に新しいバージョンのnginx(0.9.6+)がある場合は、 map でこれを実現できます。

map $http_user_agent $myindex {
  default /browser_index.html;
  ~iPhone /mobile_index.html;
}

server {
  listen 80;
  root /var/www;

  location = / { rewrite ^ $myindex; }
}

内部リダイレクトが必要ない場合(インデックス用の静的ファイルを提供しているだけの場合はおそらく必要ありません)、書き換えに「break」フラグを追加して、内部リダイレクトを回避できます。

編集:古いバージョンを使用している場合は、次のようなことができます:

server {
  listen 80;
  root /var/www;

  location = / {
    set $myindex /browser_index.html;
    if ($http_user_agent ~ iPhone) {
      set $myindex /mobile_index.html;
    }
    rewrite ^ $myindex;
  }
}

繰り返しますが、内部リダイレクトが必要ない場合は、ブレークフラグを使用します。

9
kolbyjack