похоже nginx создает некорректные http requests когда в config server, location есть proxy_path с переменными, например
proxy_pass http://$1.site.com/;
proxy_redirect http://$1.site.com/ http://$1.ru.site.com/;
ошибка происходит когда request url более сложный чем "/" вроде http://some.ru.site.com/more/complex.html
происходит обрезание request url до "GET / HTTP/1.0" вместо корректного "GET /more/complex.html HTTP/1.0"
насколько я понимаю проблема в ngx_http_proxy_module.c
когда есть хоть одна переменная в proxy uri - инициализация модуля компилирует конфиг
и заполняет список в конфиге cnf->proxy_lengths
и когда cnf->proxy_lengths не пустой - в качестве адреса запроса
берется conf->vars.uri которое формируется из proxy url, а не из request url и там всегда "/"
если убрать проверку "if (plcf->proxy_lengths)" - запросы получаются правильные
вот так
/**********************************************************************************/
-- nginx/src/http/modules/ngx_http_proxy_module.c (original revision)
+++ nginx/src/http/modules/ngx_http_proxy_module.c (working copy)
@@ -899,7 +899,7 @@
ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
- if (plcf->proxy_lengths) {
+ if (0) {
uri_len = ctx->vars.uri.len;
} else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri && r == r->main)
@@ -1005,14 +1005,14 @@
u->uri.data = b->last;
- if (plcf->proxy_lengths) {
+ if (0) {
b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);
} else if (unparsed_uri) {
b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len);
} else {
- if (r->valid_location) {
+ if (r->valid_location && plcf->proxy_lengths==NULL) {
b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len);
}
/**********************************************************************************/
собственно вопрос - можно ли убрать проверку if (plcf->proxy_lengths)
и не зарезается ли при убирании какая-нибудь полезная функциональность nginx ?