Рейтинг:0

Обратный прокси nginx с подпутью

флаг in

Я создал веб-приложение, которое будет прослушивать порт и обрабатывать HTTP-запросы. Например, если я запускаю его локально в 127.0.0.1:3000. Я могу получить к нему доступ с помощью http://127.0.0.1:3000/путь/внутри/приложение в моем браузере. Я хотел бы развернуть его на одном из моих серверов, который настроен с нгинкс обрабатывать все входящие запросы (и TLS) и пересылать их в разные приложения (прослушивая http://127.0.0.1:ххх). Обычно я предоставляю каждому приложению отдельный поддомен (например, доступ приложение1 с app1.example.com и приложение2 с app2.example.com), но было бы удобнее, если бы я мог использовать подпуть (например, доступ приложение1 с пример.com/app1 и приложение2 с пример.com/app2). Но я не уверен, как его настроить.

Мой текущий файл конфигурации выглядит следующим образом. Предположим, что мое приложение слушает 127.0.0.1:3000.

местоположение ^~ /app1 {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $http_host;
    прокси_перенаправление выключено;
    прокси_пароль http://127.0.0.1:3000/;
}

Я хотел бы добиться следующего.

  1. Когда я получаю доступ https://example.com/app1, это будет эквивалентно доступу http://127.0.0.1:3000.
  2. Когда я получаю доступ https://example.com/app1/path/within/app, это будет эквивалентно доступу http://127.0.0.1:3000/путь/внутри/приложение.

Однако с вышеупомянутым конфигурационным файлом работает только первая часть. Если я получу доступ https://example.com/app1/путь, мое приложение жалуется, что это http://127.0.0.1:3000//путь к которым на самом деле получают доступ, и он не знает, как обрабатывать //дорожка.

Я бы предпочел не изменять какую-либо часть моего приложения, чтобы оно могло работать независимо, если я решу предоставить ему поддомен в будущем, и ожидаю исправления только с изменением файла конфигурации nginx, если это возможно. Кроме того, я знаю о проблеме, заключающейся в том, что любые интерактивные ссылки, сгенерированные приложением, также должны обрабатывать подпути, но это приложение достаточно простое, чтобы это не было проблемой.

Спасибо.

Ivan Shatsky avatar
флаг gr
Измените свое местоположение на `location ^~ /app1/ { ... }` (обратите внимание на косую черту в конце). Если вы хотите, чтобы URI `/app1` тоже работал, добавьте `location = /app1 { return 301 /app1/; }` к вашей конфигурации.
lewisxy avatar
флаг in
Спасибо, есть ли способы заставить `/app1` работать без отправки 301?
Ivan Shatsky avatar
флаг gr
Вы можете попробовать `location = /app1 { rewrite ^ /app1/ last; }`. Однако в некоторых случаях это может привести к тому, что ваше приложение не сможет загрузить свои активы (см. объяснения в [этом] (https://stackoverflow.com/a/70778444/7121513) ответе), и я не рекомендую это делать.
Рейтинг:0
флаг us

Попробуйте следующую конфигурацию

местоположение /приложение1/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Хост $http_host;
    прокси_перенаправление выключено;
    прокси_пароль http://127.0.0.1:3000/;
}

местоположение / приложение1 {
    вернуть 301 /приложение1/;
}
lewisxy avatar
флаг in
Спасибо, это работает. Однако есть ли способы настроить его так, чтобы мне не нужно было отправлять 301, когда клиент обращается к `/app1`? Другими словами, я бы предпочел перенаправление на стороне сервера, а не на стороне клиента, если это возможно.
флаг us
Вы уверены, что это то, что вы хотите? Тогда у вас будет дублированный контент в URL-адресах `http://example.com/app1` и `http://example.com/app1/`, что является проблемой для SEO.
lewisxy avatar
флаг in
Текущее приложение, над которым я работаю, предоставляет только API-интерфейсы JSON, поэтому нет HTML-страницы. Однако у меня недостаточно опыта в этой теме.Каково соглашение, если мое приложение является реальным веб-сайтом? Мы обычно предпочитаем тот, у которого косая черта заканчивается, или нет? Кроме того, как этот выбор влияет на параметры запроса (после `?`) и влияет ли вообще?
флаг us
Аргументы запроса не зависят от компонента пути URL-адреса, поэтому здесь это не имеет значения. В своих собственных проектах я делаю 301 редирект с `/app1` на `/app1/`, потому что перенаправление с косой чертой в конце легче обрабатывать в разных местах.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.