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

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

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

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

Как передать данные HTTP POST в другой домен с помощью NginX?

Попробуйте использовать поддержка обратного прокси вместо. Пример 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's, а также следует сохранить и другие типы запросов, если это когда-либо станет проблемой.

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

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

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

Вы также можете добиться этого в Nginx, но используя mirror плагин не rewrite:

location "/post/uri/to/redirect/" {                                        
    mirror "/mirror";                                                       
    mirror_request_body on;                                                 
    return 200;                                                             
}                                                                           

location = "/mirror" {                                                      
    internal;                                                               
    proxy_pass "https://target_domain$request_uri";                   
    proxy_set_header Host "target_domain";                            
    proxy_set_header X-Original-URI $request_uri;                           
    proxy_set_header X-SERVER-PORT $server_port;                            
    proxy_set_header X-SERVER-ADDR $server_addr;                            
    proxy_set_header X-REAL-IP $remote_addr;                                
}