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

Я пытаюсь выяснить, как перенаправить на новую страницу (другое приложение, контроллер, действие) и сохранить текущие данные 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()));

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

- рк

Ответы [ 6 ]

17 голосов
/ 21 августа 2009

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

return $this->_forward("action", "controller", "module");
13 голосов
/ 21 августа 2009

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

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

6 голосов
/ 06 марта 2013

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

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

А затем просто используйте _forward protected method

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

Затем в переадресованном действии контроллера просто наберите

$aPost = $this->_request->getPost();
2 голосов
/ 22 октября 2013

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

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')
        )
   );
0 голосов
/ 21 августа 2009

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

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

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

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

...