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