Перенаправление на новую страницу с данными POST (PHP / Zend)

Я пытаюсь выяснить, как перенаправить на новую страницу (другое приложение, контроллер, действие) и сохранить текущие данные POST.

Мое приложение проверяет данные POST, и если выполняются определенные критерии, я хочу перенаправить их в другое место, но убедитесь, что данные POST переданы как данные POST на эту новую страницу. Вот пример:

POST /app1/example HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 17 var1=foo&var2=bar 

В моем exampleAction (Zend_Controller_Action) я проверяю, есть ли var1 == foo , и если это так, я хочу перенаправить (302) в / app2 / example с теми же данными POST. Что-то может быть так?

 HTTP/1.x 302 Found Location: /app2/example Content-Type: application/x-www-form-urlencoded Content-Length: 17 var1=foo&var2=bar 

Я вижу, как создать новый HTTP-запрос с помощью Zend_Http_Client, но я не хочу просто запрашивать страницу и отображать содержимое. Должен ли я по-прежнему искать Zend_Http_Client? На данный момент я играю с такими вещами:

 $this->getResponse()->setRedirect('/app2/example/', 302); $this->getResponse()->setBody(http_build_query($this->_request->getPost())); 

Я уверен, что то, что я хочу сделать, возможно с помощью некоторых способов обмана и демонстрации, но это определенно намекает на меня. Любая помощь приветствуется.

– rk

Вместо того, чтобы перенаправлять браузер в новое место, почему бы просто не перенаправить запрос с контроллера на другой контроллер?

 return $this->_forward("action", "controller", "module"); 

ИМО вы не можете делать перенаправление с помощью POST. См. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3

Как уже говорилось, вы можете сохранить свои POST-данные в сеансе.

Вы можете использовать объект контроллера _request

 $this->_request->setPost(array( 'someKey' => 'someValue' )); 

А затем просто используйте метод, защищенный методом _forward

 $this->_forward('yourAction', 'yourController', 'yourModule'); 

Затем в режиме перенаправленного контроллера просто вызовите

 $aPost = $this->_request->getPost(); 

Вы можете использовать помощник действия перенаправителя:

http://framework.zend.com/manual/1.12/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.redirector

Это работает для меня. Он передает учетные данные для входа из одного экрана входа в другой. 307 может привести к тому, что браузер предупредит пользователя о том, что переадресация происходит, 303 будет перенаправлять и заполнять учетные данные на следующей странице, но не отправлять вторую форму.

 $baseUrl = 'https://example.com'; $this->_redirector = $this->_helper->getHelper('Redirector'); $this->_redirector->setCode(307) ->setUseAbsoluteUri(true) ->gotoUrl($baseUrl . '/home/login', array('username' => $authForm->getValue('username'), 'password' => $authForm->getValue('password') ) ); 

Поскольку клиент обрабатывает перенаправление после ответа сервера, я не думаю, что вы можете многое сделать по этому поводу. Например, Firefox запрашивает у пользователя, хочет ли он повторно отправить данные POST в новое местоположение или нет.

Отвратительным решением было бы заполнить и вернуть HTML-форму и автоматически отправить ее с помощью JavaScript. : /

Я не слишком хорошо знаком с Zend, но есть два подхода к вашей проблеме:

  1. Храните данные POST в сеансе в течение срока действия этого запроса / перенаправления
  2. Установите перенаправление как POST и закодируйте данные. Вместо использования перенаправления просто отправьте новый заголовок с POST вместо GET.