Перенаправление к рефереру при отправке формы

#php

#php

Вопрос:

Существует несколько страниц. На этих страницах есть ссылки. Эти ссылки ведут на страницу с формой. Когда форма отправлена, страница, содержащая форму, обновляется для обработки отправленных данных.

Вот в чем вопрос.

Когда страница с формой получит отправленные данные и обработает их, это должно вернуть пользователя на страницу, которая привела его на страницу формы. Как бы вы это сделали, используя PHP?

Ответ №1:

Что мне нравится делать, так это добавлять в массив переменных сеанса каждый раз при обращении к странице под названием «история», и добавлять в массив только в том случае, если последний $_SESSION['history'] элемент не является текущим URL (избегайте нескольких последних записей при обновлении страницы, сбое проверки формы и т.д.). По сути, это крошечный след того, где побывал пользователь. Когда вы обрабатываете форму — отправьте пользователя обратно к тому значению массива, которое является самым последним, исключая URL текущей формы, если хотите. Просто убедитесь, что установлено значение по умолчанию на случай, если нет истории.

$_SERVER['HTTP_REFERER'] иногда может сработать, но у меня были серьезные проблемы с этим, и во многих случаях это не работает (обновление, переход с той же страницы, ввод URL-адреса формы, переход по ссылке электронной почты и т.д.) Лично я этого строго избегаю, поскольку это может привести к неустойчивому поведению и циклам перенаправления, если вы не будете осторожны с этим. На самом деле я бы просто никогда не использовал его для перенаправления.

Комментарии:

1. Это очень интересный подход. Похоже, что его можно было бы использовать для решения множества проблем. Спасибо!

2. Я сделал предположение здесь, что вы могли бы разобраться в коде, если бы у вас была концепция, я, вероятно, прав? Я могу поделиться кодом, если это необходимо, но я могу работать медленно. Мне пришлось бы перепроектировать его в ванильный php.

3. Конечно, я понимаю. Еще раз спасибо!

4. Просто запоздалая мысль, которую я забыл упомянуть: убедитесь, что вы не добавляете в историю ни один URL, на который невозможно перенаправить должным образом, например, URL действия формы или страницу входа / выхода. Мое общее правило — не устанавливать его, пока я не собираюсь сгенерировать HTML-страницу.

5. Плохая техника. Пользователи могут одновременно открывать 2 или более вкладок на одном и том же сайте, а вы отправляете их в никуда. Описанные ситуации являются серьезными для процессора веб-форм? В любом случае, как эта ситуация решается с помощью переменной СЕАНСА?

Ответ №2:

Эта концепция известна как получение после перенаправления. Вопрос в том, всегда ли пользователь возвращается к одной и той же статической исходной странице, или есть много страниц, которые могут привести пользователя к этой форме? Если последнее верно, просто добавьте реферер ( $_SERVER['HTTP_REFERER'] ) в качестве элемента формы, чтобы записать, откуда они пришли. php-код:

 <?php
     class controller {
        //for chaining
        public static function _() { return new self; }
        public function GET() {
           //dispay form
        }
        public function POST() {
           //process form
           //add errors to session
           if (!empty($_SESSION['form errors']) {
              $this->redirect($_SERVER['PHP_SELF']);
           }
           else {
              $this->redirect("original-user-location", true, 303);
           }
        }
        private function redirect($loc) {
           header("Location: $loc", true, 303);
           exit;
        }
        //ignore PUT, DELETE
        public function __call($_, $_) {}
     }
     controller::_()->$_SERVER['REQUEST_METHOD']();
  ?>
  

Комментарии:

1. Это прекрасно! Я использовал cookies для выполнения того же самого, и это намного элегантнее. Спасибо!

2. Однако это не сработало бы, если данные формы не будут проверены с первого раза и страница формы будет обновлена во второй раз, не так ли?

3. Вы просто отслеживаете данные формы пользователя в сеансе. В GET заполните их входные данные из этого. Пользователь может обновлять столько, сколько он хочет сейчас, это не очистит данные сеанса. Вы можете сделать это позже.