Я планирую заменить ngx_http_rewrite_module на ngx_http_script_module.
Одновременно они работать, скорее всего, не будут, но какое-то время
ngx_http_rewrite_module всё ещё будет в дистрибутиве для плавной
миграции.
Сейчас блок if - это своеобразный блок location, внутри которого есть
статическая конфигурация. Из-за этого нельзя сделать следующие вещи:
1) if на уровне сервера:
server {
if (condition) {
limit_rate 1k;
}
потому что статическая конфигурация (частью которой является limit_rate)
будет потеряна при попадании в любой location и никакого limit_rate не будет.
Поэтому используется переменная:
server {
if (condition) {
set $limit_rate 1k;
}
2) несколько последовательных истинных if'ов - проверка if'ов завершается
на первом истинном условии. В данной конфигурации
location / {
if (true) {
A
}
if (true) {
B
}
управление в B никогда не попадёт (вернее, попадёт, если воспользоваться
одним хаком).
Что планируется:
1) синтаксический сахар: вместо
set $var value;
будет
$var = value;
2) поддержка &,|,! в if.
3) else
4) не будет rewrite: вместо
rewrite ^/uri(/.*) $1 last;
будет
if ($uri ~ ^/uri(/.*)) {
$uri = $1;
continue;
}
5) внутри блоков if не будет директив статической конфигурации, а можно
будет использовать только присваивания, несколько директив модуля script
и нескольких специальных директив (например, proxy_pass):
break - прерывает исполнения директив модуля script;
continue - прерывает исполнения директив модуля script и ищет новый
location для изменённого $uri;
redirect - возвращает редирект пользователю.
Вместо
location / {
if (condition) {
rewrite ... break;
proxy_pass http://AAA;
}
proxy_pass http://BBB;
будет что-то вроде
location / {
if (condition) {
$proxy_uri = ...;
proxy_pass http://AAA;
}
proxy_pass http://BBB;
--
Игорь Сысоев
http://sysoev.ru