The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Пример привязки к географическому положению посетителя в nginx
Для начала, следует прочитать о директивах модуля ngx_http_geo_module:
http://sysoev.ru/nginx/docs/http/ngx_http_geo_module.html

Во вторую очередь нам нужно получить список сетей в нужном формате.
Так как мне нужно отделить только российские IP, у меня делается так:

   curl -f -o - http://noc.masterhost.ru/allrunet/runet \
   http://noc.zenon.net/nets/current | grep -v "0.0.0.0/0" | \
   grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\/[0-9]\+" | \
   sort | uniq | sed 's/$/ ru;/' > /etc/nginx/rugeo.conf; 

   /etc/init.d/nginx reload


Одно из условий - пользователи из любых стран с установленной cookie ALLOWIMAGES 
не должны подвергаться дискриминации по географическому признаку. 

Соответственно составляем файл конфигурации nginx.

Определяем страну (в контексте http):

   geo  $country  {
	default          en;
	include          /etc/nginx/rugeo.conf;
   }


В блоке конфигурации интересующего нас server пишем:

   location = /spacer.gif {
        empty_gif;
   }

   location ~* \.(jpg|jpeg|gif|png)$ {
	set  $allow_images  1;

	if ($country = 'en') {
		set  $allow_images  0;
	}

	if ($http_cookie ~* ALLOWIMAGES) {
		set  $allow_images  1;
	}

	if ($allow_images != 1) {
		rewrite  ^/images/.*$ /spacer.gif break;
	}
	
        expires         7d;
        root /home/www/htdocs;
        if (!-f $request_filename) {
                proxy_pass        http://backend;
        }
   }


Таким образом всем посторонним иностранцам вместо фотографий будет видна пустота, 
а всем своим фотографии будут видны откуда бы они не заходили.



Для ситуаций, когда блокировка обусловлена экономией трафика,
http://sergeyx.livejournal.com/ в комментарии
советует использовать бесплатную сеть доставки контента CoralCDN (http://www.coralcdn.org):

Руководство по настройке: http://wiki.coralcdn.org/wiki.php?n=Main.Servers
Например, запросив http://www.test.ru.nyud.net:8080/img/test.gif сеть CoralCDN выступит 
в роли кэшируюшего прокси для доставки нужного файла.

Пример для организации отдачи трафика через CoralCDN для посетителей с некорректным referer:

   location /i/ {
      ...
      # Избегаем зацикливания для запросов от CoralCDN
      if ($http_user_agent ~ CoralWebPrx) {
         break;
      }
      if ($query_string ~ coral-no-serve) {
         break;
      }
      # Перенаправляем запросы только на существующие файлы
      if (!-f $request_filename) {
         break;
      }
      # Для посетителей с некорректным referer делаем редирект в CoralCDN
      # корректность определяем через встроенную переменную nginx $invalid_referer
      # вместо SITE нужно подставить имя хоста.
      if ($invalid_referer) {
         rewrite ^(.+)$ http://SITE.nyud.net$1;
      }
      ...
   }


Пример для Apache с mod_rewrite:

   RewriteEngine on
   RewriteCond %{HTTP_USER_AGENT} !^CoralWebPrx
   RewriteCond %{QUERY_STRING} !(^|&)coral-no-serve$
   RewriteRule ^/images/foo(.*)$  http://foo.bar.nyud.net:8080/images/foo$1 [R,L]
или можно сразу подставить HTTP_HOST
   RewriteRule ^/images/foo(.*)$ http://%{HTTP_HOST}.nyud.net:8080/images/foo$1 [R,L]
 
14.07.2008 , Автор: alexkbs , Источник: http://alexkbs.livejournal.com/3589...
Ключи: nginx, geo, rewrite, mod_rewrite, cdn
Раздел:    Корень / Администратору / Сетевые сервисы / WWW, Apache httpd / Редирект, mod_rewrite

Обсуждение [ RSS ]
  • 1, User294 (ok), 18:35, 16/07/2008 [ответить]  
  • +/
    > Так как мне нужно отделить только российские IP

    А вот интересно, есть в природе цивильное решение не делающее таких дубовых допущений?А то вон какойнить aMule запросто показывает что вон тот юзер - из USA, а вон тот из гватемалы.Т.е. ip2country умеет.А для серверов что-то аналогичное и готовое есть?

    > Таким образом всем посторонним иностранцам
    > вместо фотографий будет видна пустота,

    А это зачем вообще в таком виде надо?Типа дерьмовость хостинга и ограниченность траффика скомпенсируем крютым техническим решением?Если честно то в моем понимании правильное решение - послать на**й такой хостинг :)

     
     
  • 2, migosm (?), 19:59, 16/07/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Вы(User294) видимо ничего не видели в жизни кроме мастерхоста и годедди. Про балетпруф видимо в итоге не в курсе....
     
     
  • 3, User294 (ok), 00:40, 27/07/2008 [^] [^^] [^^^] [ответить]  
  • +/
    > видимо ничего не видели в жизни кроме мастерхоста и годедди

    О господи, какие все умные. А почему вы сразу эти общественные туалеты вспомнили?Пользуетесь ими?

    А у меня если что несколько VDS по всему миру где я сам себе режиссер.

    > Про балетпруф видимо в итоге не в курсе....

    Это что?Метод страуса ака надежда на то что хацкер не найдет русскую проксю?Или от кого защищаться то?От посетителей сайта?Гм, кульно придумано :)))))).Мне очевидно что если некто не может сгрузить картинку то и сайт ему нормально посмотреть опаньки.Лично я для себя видел такое применение этой фичности: янки по дефолту кажем инглиш, русским - русиш.Ну и прочая.По-моему было бы нормальным применением.Вместо какого-то непонятного мне онанизма с игрой в страусов.

     
  • 5, alexkbs (?), 14:09, 24/03/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Это нужно чтобы, например, показывать фотографии которые не должны видеть их владельцы, живущие не в России.
     

  • 4, alexkbs (?), 14:07, 24/03/2010 [ответить]  
  • +/
    Список сетей правильно будет получать так:

    curl -f -o - http://noc.masterhost.ru/allrunet/runet \
    | grep -v "0.0.0.0/0" | \
    grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\/[0-9]\+" | \
    sort | uniq | sed 's/$/ ru;/' > /etc/nginx/rugeo.conf; \
    /etc/init.d/nginx reload

    Или так:

    curl -f -o - http://noc.zenon.net/nets/current | \
    grep international -B100000 | grep -v "0.0.0.0/0" | \
    grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\/[0-9]\{1,2\}" | \
    sort | uniq | sed 's/\(\/[0-9]\+\)/\1 ru;/' > /etc/nginx/rugeo.conf; \
    /etc/init.d/nginx reload

    В исходном посте была то ли ошибка, то ли опечатка, смотря как считать.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру