идентификатор запроса в nginx

Rommer rommer at active.by
Tue May 22 11:42:26 MSD 2007


Здравствуйте,

Igor Sysoev wrote:
> On Thu, May 10, 2007 at 01:07:24PM +0300, Rommer wrote:
> 
>> Есть ли какая-нибудь рандомная переменная в nginx, которая уникально 
>> идентифицирует каждый запрос?
>> Например как $remote_port, только чтобы скрипты на бэкенде её узнать не 
>> могли.
> 
> Запрос - нет, соденинения - да: $connection.
> 

Ладно опишу задачу.
Есть такой замечательный модуль mod_aclr (http://miksir.pp.ru/?r=69) для apache 1.3,
я его переписал для apache 2.0 и хочу использовать. Вот его минимальная конфигурация
для nginx'а:

location / {
	proxy_pass          http://127.0.0.1:80;
	proxy_set_header    X-Accel-Internal /internal_xxx;
}
location /internal_xxx/ {
	internal;
	rewrite    ^/internal_xxx/(.*)$ /$1 break;
	root        /;
}


В отличие от оригинального модуля, мой выдает содержимое X-Accel-Internal + полный путь
к файлу, а не X-Accel-Internal + get-запрос, который пришёл в httpd в случае статического
файла. + скрывает для скриптов содержимое заголовка X-Accel-Internal.
Но в этой конфигурации есть дыра: если скрипт на стороне бэкенда выдаст, например,
X-Accel-Redirect: /internal_xxx/etc/passwd, то nginx спокойно его и отдаст в браузер.
Я решил обойти это следующим способом:

location / {
	proxy_pass          http://127.0.0.1:80;
	proxy_set_header    X-Accel-Internal /internal_xxx/$request_key;
}
location /internal_xxx/ {
         internal;
	set         $key -1;
         if ($uri ~ ^/internal_xxx/(\d+)/) {
             set     $key $1;
         }
         if ($key != $request_key) {
             return  403;
         }
	rewrite    ^/internal_xxx/\d+/(.*)$ /$1 break;
	root        /;
}

Но для этой схемы нету никакого подходящего $request_key. Подошел бы даже
$connection, но, к сожалению, на уровне server { } и location { } он не доступен.

Если проблему решить получится штатными средствами nginx'а - выложу куда-нибудь свой модуль.

-- 
С уважением,
Роман Шишнёв





More information about the nginx-ru mailing list