Я прочитал аналогичную проблему ниже, но у меня возникла проблема, которую я объясню позже в вопросе:
У меня есть конфигурация, как показано ниже proxy_pass
чтобы upstream
:
location /api2/ {
client_max_body_size 10m;
if ($scheme = 'https') {
proxy_pass https://api.example.com;
}
if ($scheme = 'http') {
proxy_pass http://api.example.com;
}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
Здесь api2
раздел отправляется в апстрим. В вопросе, который я связал выше, использует /
в конце proxy_pass
опустить api2
часть. Когда я добавляю /
в конце proxy_pass
Я получаю следующую ошибку:
nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/sites-enabled/mysite:160
Когда я искал указанную выше ошибку, сообщество говорит, что вам нужно удалить /
в proxy_pass, чтобы устранить ошибку.
Итак, вопрос в том, почему я получаю api2
в восходящем потоке? Как мне удалить api2
при проксировании?
Когда я меняю конфигурацию на:
location /api2/ {
client_max_body_size 10m;
proxy_pass http://api.example.com/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
Это работает, но https
запросы имеют проблемы с отправкой запроса.
В разделе восходящего потока я получаю следующую ошибку:
GET //api2/my_endpoint HTTP/1.1" 404
Ну, дело в том, что proxy_pass
когда вы явно не указываете URI, на который вы проксируете, не трогайте его. Вообще. Таким образом, вы получаете точный входной URI, например / api2 /.
Если вам нужно вмешаться в URI во время его проксирования, вам нужно использовать rewrite
директива. Самым простым решением было бы сделать что-то подобное внутри вашего location
пункт:
rewrite ^/api2/(.*) /$1 break;
Также не то, чтобы проксирование на один и тот же URL-адрес, но с двумя разными схемами выглядело излишним. Я бы сказал, что вам следует либо прекратить TLS на своем прокси-сервере, либо, если промежуточный транспорт является предметом компрометации, избавиться от простого HTTP.