Nginx-ru mailing list archive (nginx-ru@sysoev.ru) 
 
 
[Date Prev ][Date Next ][Thread Prev ][Thread Next ][Date Index ][Thread Index ]
 
Re[3]: referer 
 
 
On Sun, 27 Mar 2005, Alexey Bestciokov wrote:
 
да, это вероятно решит большую часть проблем !
 
Патчик.
 
IS> Наверное, нужно в придачу к none сделать ещё параметр blocked,
IS> который бы разрешал доступ с реферером, неначинающимся на "http://"  ;.
 
IS> On Sun, 27 Mar 2005, Alexey Bestciokov wrote:
 
Игорь, подскажи пожалуйста, а есть возможность проверять реферер, как для
юзер агент ?
что нить вроде if ($HTTP_REFERE ~ site_com) ?
 
IS> Да. Сейчас поддерживаются все заголовки запроса в форме $HTTP_...
IS> и ещё несколько перемнных: $REMOTE_ADDR, $DOCUMENT_URI и $QUERY_STRING.
IS> Но конкретно реферер лучше проверять с помощью директив
IS>       valid_referers  none  server_names  *.example.com;
IS>       if ($invalid_referer) {
IS>           ...
IS>       }
 
Игорь Сысоев
http://sysoev.ru  --- src/http/modules/ngx_http_rewrite_module.c  Thu Mar 24 22:59:19 2005
+++ src/http/modules/ngx_http_rewrite_module.c  Sun Mar 27 22:03:13 2005
@@ -36,6 +36,7 @@
     ngx_flag_t                    log;
 
     ngx_flag_t                    no_referer;
+    ngx_flag_t                    blocked_referer;
 } ngx_http_rewrite_loc_conf_t;
 
 
@@ -716,6 +717,7 @@
             e->sp++;
 
             return;
+
         } else {
             e->sp->value = 1;
             e->sp->text.len = 1;
@@ -732,12 +734,22 @@
     if (len < sizeof("http://i.ru"  ;) - 1
         || (ngx_strncasecmp(ref, "http://"  ;, 7) != 0))
     {
-        e->sp->value = 1;
-        e->sp->text.len = 1;
-        e->sp->text.data = (u_char *) "1";
-        e->sp++;
+        if (cf->blocked_referer) {
+            e->sp->value = 0;
+            e->sp->text.len = 0;
+            e->sp->text.data = (u_char *) "0";
+            e->sp++;
 
-        return;
+            return;
+
+        } else {
+            e->sp->value = 1;
+            e->sp->text.len = 1;
+            e->sp->text.data = (u_char *) "1";
+            e->sp++;
+
+            return;
+        }
     }
 
     len -= 7;
@@ -854,6 +866,7 @@
     conf->stack_size = NGX_CONF_UNSET_UINT;
     conf->log = NGX_CONF_UNSET;
     conf->no_referer = NGX_CONF_UNSET;
+    conf->blocked_referer = NGX_CONF_UNSET;
 
     return conf;
 }
@@ -874,12 +887,17 @@
     if (conf->referers == NULL) {
         conf->referers = prev->referers;
         ngx_conf_merge_value(conf->no_referer, prev->no_referer, 0);
+        ngx_conf_merge_value(conf->blocked_referer, prev->blocked_referer, 0);
     }
 
     if (conf->no_referer == NGX_CONF_UNSET) {
         conf->no_referer = 0;
     }
 
+    if (conf->blocked_referer == NGX_CONF_UNSET) {
+        conf->blocked_referer = 0;
+    }
+
     if (conf->codes == NULL) {
         return NGX_CONF_OK;
     }
@@ -1538,6 +1556,11 @@
 
         if (ngx_strcmp(value[i].data, "none") == 0) {
             lcf->no_referer = 1;
+            continue;
+        }
+
+        if (ngx_strcmp(value[i].data, "blocked") == 0) {
+            lcf->blocked_referer = 1;
             continue;
         }