як мені змусити 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дані, але я не знаю про те, що зараз робиться.


приголомшливий! працює як шарм
Jiho Kang,

трохи розгублений від коментаря. Я взагалі хочу встановити proxy_set_headerзначення? В іншому випадку я думаю, що віддалена адреса стає віддаленою адресою проксі-сервера, але те, що я зазвичай хочу, це віддалена адреса клієнта, правильно?
Георгій Плігоропулос

Дякую за відповідь, яка врятувала мене! Чи є спосіб налаштувати nginx, щоб він передавав запити коректно назад до uwsgi, але з розетками замість запуску uwsgi в режимі http?
Грег Дженнінгс

@GregJennings Трохи запізнюється на відповідь, але можна використовувати директиву "uwsgi_pass" замість "proxy_pass". На
всякий

1
@ Буде proxy_redirectдва аргументи. Дивіться документи: nginx.org/en/docs/http/…
Меттью Шарлі,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.