Ответ 1
Вместо того, чтобы перенаправлять браузер в новое место, почему бы просто не перенаправить запрос от контроллера на другой контроллер?
return $this->_forward("action", "controller", "module");
Я пытаюсь выяснить, как перенаправить на новую страницу (другое приложение, контроллер, действие) и сохранить текущие данные 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) в /app 2/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 Controller
$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, но есть два подхода к вашей проблеме: