referer

Igor Sysoev is at rambler-co.ru
Sun Mar 27 22:06:53 MSD 2005


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


More information about the nginx-ru mailing list