Для начала, следует прочитать о директивах модуля 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]
URL: http://alexkbs.livejournal.com/358906.html
Обсуждается: http://www.opennet.me/tips/info/1717.shtml