как мне получить nginx для пересылки HTTP POST-запросов через перезапись?

19

В настоящее время мое приложение iOS получает доступ к домену A через http POST, но я бы хотел перенаправить все запросы в домен B.

Если я использую обычные rewrite ^/(.*)$ http://mydomain/$1 permanent;данные POST, кажется, теряется.

Как я могу передать данные HTTP POST в другой домен, используя NginX?

Джихо Канг
источник

Ответы:

32

Попробуйте использовать поддержку обратного прокси . Пример locationраздела будет:

location / {
  proxy_pass      http://localhost:8080;
  proxy_redirect  http://localhost:8080/ /;
  proxy_read_timeout 60s;

  # May not need or want to set Host. Should default to the above hostname.
  proxy_set_header          Host            $host;
  proxy_set_header          X-Real-IP       $remote_addr;
  proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
}

В этом примере все запросы к этому serverблоку будут передаваться на второй запущенный сервер localhost:8080. Это сохраняет POSTи должно также сохранять другие типы запросов, если это когда-либо станет проблемой.

Проблема в том, что внешние перенаправления никогда не будут повторно отправлять POSTданные. Это записано в спецификации HTTP (см. Раздел 3xx). Любой клиент, который делает это, нарушает спецификацию.

Если код состояния 301/302 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых был выдан запрос ,

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

Мэтью Шарли
источник
Awsome! работает как шарм
Jiho Kang
немного смущен от комментариев. Я вообще хочу установить proxy_set_headerзначения? В противном случае я предполагаю, что удаленный адрес становится удаленным адресом прокси-сервера, но что я обычно хочу, так это удаленный адрес клиента, верно?
Георгиос Плигоропулос
Спасибо за ответ, который спас меня! Есть ли способ настроить nginx так, чтобы он правильно передавал пост-запросы обратно в uwsgi, но с сокетами вместо запуска uwsgi в режиме http?
Грег Дженнингс
@GregJennings Немного поздно для ответа, но вместо proxy_pass следует использовать директиву uwsgi_pass. На всякий случай, если кто-то еще бродит, глядя ...
Камилион
1
@Will proxy_redirectпринимает два аргумента. См. Документы: nginx.org/en/docs/http/…
Мэтью Шарли