NGINX перенаправляет все запросы, соответствующие URL-адресу с параметрами, на субдомен

У меня есть веб-сайт, который также обслуживает запросы api к приложению в основном домене. Я хотел бы отправить все соответствующие запросы / api на поддомен api.

Например, мне нужно https://example.com/api + https://example.com/api/some_action + https://example.com/api/some_action?params1=somevalue¶ms2=value2 .... для перенаправления на ту же структуру URL, но только на поддомене.

Итак, для приведенного выше примера:

https://example.com/api -> https://api.example.com/api

https://example.com/api/some_action -> https://api.example.com/api/some_action

https://example.com/api/some_action?params1=somevalue¶ms2=value2 .... -> https://api.example.com/api/some_action?params1=somevalue¶ms2=value2 ....

Также для всех типов запросов (получение, публикация и т. Д.). До сих пор я пробовал это в директиве сервера для основного домена (в директиве сервера SSL 443)

location ~ /api(.*)$ {
  return 301 https://api.example.com/api/$request_uri$is_args$args;
}

Результат, который я получаю при выполнении простого запроса GET на https://api.example.com/api/some_action?param1=value ... равно https://api.example.com//some_action без параметров и без api.


person Ranknoodle    schedule 08.02.2019    source источник
comment
Уточните, пожалуйста, ваш последний абзац. Конфигурация, указанная в вашем вопросе, должна включать /api/api/ и удваивать аргументы, поскольку $request_uri уже содержит как /api, так и аргументы.   -  person Richard Smith    schedule 09.02.2019
comment
@RichardSmith это приложение rails, а контроллер называется api, который обслуживает все запросы api. Поддомен называется api.example.com, поэтому это немного сбивает с толку, но, например, в новой настройке будет api.example.com/api/action.   -  person Ranknoodle    schedule 10.02.2019


Ответы (1)


Чтобы перенаправить example.com/api/foo?bar на api.example.com/api/foo?bar, вы должны использовать:

location ^~ /api {
    return 307 https://api.exemple.com$request_uri;
}

Переменная $request_uri содержит исходный запрос, включая префикс /api/ и строку запроса.

Оператор ^~ дает этому location приоритет (подробности см. В этом документе) . Код состояния 307 поддерживает GET / POST через перенаправление (подробнее см. эту ссылку) .

person Richard Smith    schedule 09.02.2019
comment
Спасибо, это работает по большей части, но у меня возникла проблема, связанная с чем-то другим ... Вы знаете, пересылаются ли (перенаправляются) HTTP-заголовки? Я использую токен аутентификации в заголовке, чтобы мне понравился этот developer.mozilla .org / en-US / docs / Web / HTTP / Headers / Authorization и получают ошибки в журналах домена api.example.com для запросов аутентификации, которые 307 отправляются через указанное выше местоположение. - person Ranknoodle; 10.02.2019
comment
Это похоже на совершенно новый вопрос. IDK, если аутентификация работает между доменом и поддоменом. - person Richard Smith; 10.02.2019
comment
достаточно честно, пока этот ответ работал у меня, и спасибо за ваш ответ! - person Ranknoodle; 11.02.2019