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'а - выложу куда-нибудь
свой модуль.
--
С уважением,
Роман Шишнёв