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