Подтвердить что ты не робот

Nginx 'proxy_pass' не может иметь URI-часть в местоположении?

У меня есть блок location как

location @test{
    proxy_pass http://localhost:5000/1;
}

но nginx жалуется, что "proxy_pass cannot have URI part in location given by regular expression..." Кто-нибудь знает, что может быть неправильным?

Я пытаюсь выполнить запрос localhost: 5000/1, когда загрузка завершена:

location /upload_attachment {
    upload_pass @test;
    upload_store /tmp;
    ...
}
4b9b3361

Ответ 1

Технически просто добавление URI должно работать, потому что оно описано здесь, и в нем говорится, что он должен работать, поэтому

location @test{
    proxy_pass http://localhost:5000/1/; # with a trailing slash
}

Должно было хорошо работать, но, поскольку вы сказали, что я не предложил другой способ, трюк заключается в том, что вместо передачи /my/uri в localhost:5000/1 мы передаем /1/my/uri в localhost:5000,

То, что сделал мой переписывающий

rewrite ^ /1$1

Значение переписывает весь URL-адрес, добавьте его с помощью /1, затем добавьте оставшийся, весь блок станет

location @test{
    rewrite ^ /1$1;
    proxy_pass http://localhost:5000;
}

Примечание: @Fleshgrinder предоставил ответ, объяснив, почему первый метод не работал.

Ответ 2

Что на самом деле происходит здесь?

nginx не может обработать вашу желаемую часть URI в директиве proxy_pass, потому что вы находитесь в именованном месте (следовательно, сообщение об ошибке). Это связано с тем, что nginx построен модульно, и каждый блок конфигурации считывается различными этапами различными модулями. Поэтому просто помните, что вы не можете иметь URI в своей директиве proxy_pass в следующих случаях:

  • Расположение регулярных выражений
  • Именованные местоположения
  • if Блоки

Как мы можем решить эту проблему?

Мохаммад Абушади объяснил, как сделать переписывание и передать запрошенный URI на прокси-сервер. Я просто хотел пояснить причину.

Ответ 3

Попробуйте исключить "/" (часть URI) и проверьте.

location @test{
    proxy_pass http://localhost:5000;
}