ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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

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'а - выложу куда-нибудь 
свой модуль.

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



 




Copyright © Lexa Software, 1996-2009.