Я пытаюсь выяснить, как перенаправить на новую страницу (другое приложение, контроллер, действие) и сохранить текущие данные 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();
Вы можете использовать помощник действия перенаправителя:
Это работает для меня. Он передает учетные данные для входа из одного экрана входа в другой. 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, но есть два подхода к вашей проблеме: