Редирект после запроса HTTP POST

Date July 15th, 2010 Author Vitaly Agapov

Протокол HTTP подразумевает выполнение редиректа на новую страницу после обработки данных, полученных от пользователя методом POST. Само собой, это не обязательно. А на страницах, где методом POST отправляется некоторый поисковый запрос, это вообще ни к чему. Нужен он лишь в случаях, когда отправленные данные где-то на сервере сохраняются – тогда редирект позволяет избежать двойной отправки данных при перезагрузке страницы по F5 или при возврате на неё.
Если следовать протоколу, то согласно RFC 2616 сервер на запрос POST должен отвечать статусом 303 See Other, так как обычный для редиректа статус 302 Found должен использоваться по стандарту только для запросов GET или HEAD. Единственным подводным камнем можно считать то, что существуют юзер-агенты, не понимающие стандарта HTTP/1.1 и, следовательно, не знающие статуса 303. Впрочем, я склонен думать, что это раритет и ориентироваться на него не стоит. Тем более, что получение статуса 302 в ответ на POST-запрос может заставить некоторые браузеры, свято блюдущие букву стандарта, выдать пользователю предупреждение.
Вот как реализую редирект я.

      use CGI;
      $cgi = new CGI;
      # обрабатываем POST, сохраняем данные
      # .....
      my $url="http://".$ENV{SERVER_NAME}."/url-that-i-need";
        if ($redirect_trigger)
        {
                print $cgi->redirect(
                   -uri=>$url,
                   -status=>303);
                print qq~
                  <script language="javascript">
                        location.replace('/url-that-i-need');
                  </script>
                ~;
                print $cgi->end_html;
                exit(0);
        }

Такой вариант даже при экстремальной простоте вполне работоспособен. К тому же в нём редирект дублируется JavaScript’ом – если статус 303 юзер-агентом не воспримется, то, возможно, сработает JS-код. Есть также смысл расположить его как обработчик события onload для объекта body.

Tags: ,
Category: Perl, Web-dev | No comments »

Comments

Leave a comment

 Comment Form