Различное поведение "location" и "proxy_pass" в nginx x-accel-redirect

У меня есть конфинтер nginx:

location ^~ /mount_points/mount_point1 {
  internal;
  alias /repos/mount_point_one;
}

location ^~ /to_proxy {
  internal;
  proxy_pass http://myproxy:5000;
}

Когда я запрашиваю http://localhost/mount_points/mount_point1/myfile.zip, я получаю "/repos/mount_point_one/myfile.zip", как и ожидалось.

При запросе " http://localhost/to_proxy/myfile2.html" я получаю " http://myproxy:5000/to_proxy/myfile2.html".

В первом случае часть "/mount_points/mount_point1" была удалена, а во втором случае часть "/ to_proxy" все еще там, я должен подделать адрес "/ to_proxy" на вышестоящем сервере, чтобы выяснить это.

Я что-то пропустил? Если мне просто нужно переписать URL, как я могу удалить проблему части "/ to_proxy" на вышестоящий сервер?

Спасибо.

1 ответ

Решение

proxy_pass директива может выполнять функцию псевдонимов, но только если предоставляется дополнительный URI.

location ^~ /to_proxy/ {
    internal;
    proxy_pass http://myproxy:5000/;
}

Для правильного отображения псевдонимов необходимо использовать / также добавляется к location параметр.

Смотрите этот документ для деталей.

Если трейлинг / на location параметр вызывает проблемы, вы можете использовать rewrite ... break вместо:

location ^~ /to_proxy {
    internal;
    rewrite ^/to_proxy(?:/(.*))?$ /$1 break;
    proxy_pass http://myproxy:5000;
}
Другие вопросы по тегам