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;
...
}
Ответы
Ответ 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;
}