Hello!
On Tue, Nov 09, 2010 at 02:42:28PM +0300, Alex L. Demidov wrote:
Есть nginx front-end, который слушает на всех хостах вида
^[0-9]+.example.com и делает proxy_pass на 127.0.0.0 и порт
соответствующий поддомену example.com, например, при обращении к
12345.example.com идет proxy_pass к 127.0.0.1:12345. На 127.0.0.1
могут слушать сотни и тысячи портов, которые на самом деле
туннелятся на внешние железки, отвечающие по http, причем эти
туннели могут динамически появляться и пропадать.
Проблема собственно в том, что одна из этих железок выдает 302
Redirect, которые нужно переписать, но proxy_redirect не понимает
переменные в первом параметре, как в примере ниже, где
закомментировано:
-----------------------------------------------------------------------
http {
perl_set $decoded_port '...
perl code to extract prefix from Host: header
...';
server {
listen 80;
server_name ~^[0-9]+\.example\.com;
location / {
proxy_pass http://127.0.0.1:$decoded_port;
# proxy_redirect http://127.0.0.1:$decoded_port/ # http://$decoded_port.example.com/;
proxy_redirect http://127.0.0.1:12345/ http://$decoded_port.example.com/;
}
}
}
-----------------------------------------------------------------------
Вопросы:
Есть ли какие-либо варианты переписать Redirect в данной ситуации?
Можно ещё попробовать через proxy_hide_header +
proxy_intercept_errors + error_page 302 + add_header.
Если нагенерировать 64K строчек со всеми портами - не упрусь ли я в
какие-либо ограничения?
Нет, но применение proxy_redirect'ов делается до первого
совпадения, так что 64k строк - это не очень оптимальное решение.