Назад | Перейти на главную страницу

Как удалить путь с nginx proxy_pass в http и https?

Я прочитал аналогичную проблему ниже, но у меня возникла проблема, которую я объясню позже в вопросе:

У меня есть конфигурация, как показано ниже 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.