URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7524
[ Назад ]

Исходное сообщение
"конфиг nginx, location и юзерагент"

Отправлено greyroot , 10-Май-12 16:41 
Дано
location /nod32 {
root /var/www/

ls /var/www/nod32/
eset_upd nod_upd


Задача - чтоб в зависимости от юзерагента подсовывалось либо один каталог, лмбо другой.

if ($http_user_agent ~ .*BPC.[345].*) {
rewrite ^(.*)$ /eset_upd/$1 last;
}
if ($http_user_agent ~ .*BPC.2.*) {
rewrite ^(.*)$ /nod_upd/$1 last;
}

типа такого я кое-как накарябал, но оно работает совсем не так, как хочется, оно идёт судя по логам куда-то в /html/eset_upd//nod32/update.ver, а надо что б в /nod32/eset_upd напимер откуда берётся этот /html и как правильно задать путь?


Содержание

Сообщения в этом обсуждении
"конфиг nginx, location и юзерагент"
Отправлено erera22 , 10-Май-12 18:14 
> надо что б в /nod32/eset_upd напимер откуда берётся этот /html и
> как правильно задать путь?

Видимо, есть отдельный location для eset_upd или определена ранее директива root, которая и сказывается на location ~ /eset_upd.
Зачем два if?

Лучше приведите конфиг целиком.

Но для примера (считаем, что вы сугубо сливаете статику):
server {
   listen 80;
   server_name <domain.name>;

   location /nod32 {
      root /var/www/nod32/nod_upd/;

      if ($http_user_agent ~ "BPC\.[345]") {
         root /var/www/nod32/eset_upd;
      }
   }
}


"конфиг nginx, location и юзерагент"
Отправлено greyroot , 10-Май-12 19:03 
>> надо что б в /nod32/eset_upd напимер откуда берётся этот /html и
>> как правильно задать путь?
> Видимо, есть отдельный location для eset_upd или определена ранее директива root, которая
> и сказывается на location ~ /eset_upd.

нет, никаких директив больше нет

> Зачем два if?

Потому что несколько условий будет, этими 2мя не ограничится.
> Лучше приведите конфиг целиком.

Он уже весь тут, без указаний опций авторизации итп, т.е всего несколько строк

>[оверквотинг удален]
> server {
>    listen 80;
>    server_name <domain.name>;
>    location /nod32 {
>       root /var/www/nod32/nod_upd/;
>       if ($http_user_agent ~ "BPC\.[345]") {
>          root /var/www/nod32/eset_upd;
>       }
>    }
> }

т.е без использования рерайта? Очень интересно, спасибо. Пока сделал без location /nod32, т.е клиент обращаться напрямую будет к сайту, а nginx, видя его юзерагент, напрявлять куда надо:

location  / {
                root    /var/www/;
                ## тут опции авторизации и кастомные логи
                if ($http_user_agent ~ .*BPC.[345].*) {
                rewrite  ^(.*)  /nod32/eset_upd/$1 break;
                }
                if ($http_user_agent ~ .*BPC.2.*) {
                rewrite  ^(.*)  /nod32/nod_upd/$1  break;
                }

Имхо, даже удобнее и красивее для пользователя.

Так работает. Ведь когда (если) я укажу index.html, это не помешает?

Всё же очень хочется разобраться с рерайтом, отчего клмент стучится во всякие /var/www/nod32/eset_upd//nod32/

Надо разобраться с регекспами, видимо. Как я понял, в конфиге nginx используются перловые регеспы? Не порекомендуете пособие for dummies?


"конфиг nginx, location и юзерагент"
Отправлено erera22 , 11-Май-12 15:05 
>[оверквотинг удален]
>     rewrite  ^(.*)  /nod32/eset_upd/$1 break;
>            
>     }
>            
>     if ($http_user_agent ~ .*BPC.2.*) {
>            
>     rewrite  ^(.*)  /nod32/nod_upd/$1  break;
>            
>     }
> Имхо, даже удобнее и красивее для пользователя.

http://wiki.nginx.org/IfIsEvil

> Так работает. Ведь когда (если) я укажу index.html, это не помешает?

location / {
   index index.html;
   ...
}

> Всё же очень хочется разобраться с рерайтом, отчего клмент стучится во всякие
> /var/www/nod32/eset_upd//nod32/
> Надо разобраться с регекспами, видимо. Как я понял, в конфиге nginx используются
> перловые регеспы? Не порекомендуете пособие for dummies?

rewrite лучше использовать в случае переопределения url, к примеру:
location ~* "/main.page" {
   rewrite ^(.*)$ http://google.com last;
}

В вашем (описанном) случае куда как разумнее было бы просто переопределять root директорию.

Как вариант сделать вовсе без IF инструкций, обозвав eset_upd и nod_upd согласно версий браузера, тогда конфиг nginx примет вид:
location / {
   set $dir $http_user_agent;
   root /var/www/$dir;

   try_files $uri $uri/ =404;
}

Лучше сразу делать как правильно, а не как "красивее".