Назад | Перейти на главную страницу

Обслуживайте разные файлы для определенных пользовательских агентов с помощью 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;
    }
  }
}

Если у вас достаточно новая версия nginx (0.9.6+), вы можете сделать это с помощью карта:

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

снова, используя флаг прерывания, если вам не нужно внутреннее перенаправление.