Изменения в nginx 0.1.17 03.02.2005
*) Добавление: модуль ngx_http_rewrite_module полностью переписан.
Теперь можно делать редиректы, возвращать коды ошибок и проверять
переменные и рефереры. Эти директивы можно использовать внутри
location. Директива redirect упразднена.
*) Добавление: модуль ngx_http_geo_module.
*) Добавление: директивы proxy_set_x_var и fastcgi_set_var.
*) Исправление: конфигурация location с модификатором "=" могла
использоваться в другом location.
*) Исправление: правильный тип ответа выставлялся только для запросов,
у которых в расширении были только маленькие буквы.
*) Исправление: если для location установлен proxy_pass или
fastcgi_pass, и доступ к нему запрещался, а ошибка перенаправлялась
на статическую страницу, то происходил segmentation fault.
*) Исправление: если в проксированном ответе в заголовке "Location"
передавался относительный URL, то к нему добавлялось имя хоста и
слэш; ошибка появилась в 0.1.14.
*) Исправление: на Linux в лог не записывался текст системной ошибки.
Комментарий.
geo
Описывается на уровне http. Может быть несколько переменных.
geo name {
default 0;
include list0;
include list1;
192.168.0.0/16 50;
}
Можно указывать числа или строки, например,
192.168.0.0/16 RU;
Переменную можно передавать в "proxy_set_x_var name" и
"fastcgi_set_var name". Ещё можно проверять так: if ($name) { ... }
Внутри if можно задавть не только директивы rewrite, но и обычные,
сейчас можно только две:
if ($slow) {
limit_rate 10k;
}
или
if ($no_gzip) {
gzip off;
}
Остальные директивы пока не работают, но добавить их достаточно быстрая,
но муторная процедура.
rewrite
Формат: "rewrite regex subst modifier"
Если subst начинается с http://, то это редирект.
modifier могут быть следующими: last, redirect и permanent.
redirect нужен для задания subst без http://.
Можно задавать рефереры:
valid_referers none server_names *.example.com/;
и затем проверять их:
if ($invalid_referer) {
rewrite ^/ http://www.example.com;
или
return 403;
}
Как кодируются всякие странные символы в rewrite, зависит от того,
будет выполнятся редирект или нет. Запрос
/test/one%20+%25%3Ftwo/three%20+%25%3Ffour?five=six%20+%25%3Fseven
будет переписан директивой
rewrite ^/test/(.+)/(.+)$ /$1?uname=$2 last;
в "/one +%?two", и аргументы у него будут такие:
uname=three%20%2b%25%3ffour&five=six%20+%25%3Fseven
Директива rewrite ^/test/(.+)/(.+)$ /$1?uname=$2 redirect;
этот же запрос перепишет в
/one%20%2b%25%3ftwo?uname=three%20%2b%25%3ffour&five=six%20+%25%3Fseven
Игорь Сысоев
http://sysoev.ru