Подтвердить что ты не робот

Перенаправление на новую страницу с данными 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) в /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

4b9b3361

Ответ 1

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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')
        )
   );

Ответ 5

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

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

Ответ 6

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

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