在表单提交时重定向到引荐来源

时间:2011-04-30 16:24:10

标签: php

有多个页面。这些页面上有链接。这些链接指向带有表单的页面。提交表单时,保存表单的页面将刷新自身以处理提交的数据。

这是问题所在。

当带有表单的页面接收提交的数据并对其进行处理时,应该将用户带回到将他/她带到表单页面的页面。您将如何使用PHP进行此操作?

2 个答案:

答案 0 :(得分:3)

我喜欢做的是每次访问一个名为“history”的页面时添加一个会话变量数组,并且只有当最后一个$_SESSION['history']项不是当前url时才添加到数组中(避免多个最近的页面刷新,表单验证失败等条目。基本上是用户所在位置的面包屑痕迹。处理表单时 - 将用户返回到最新的数组值,如果您愿意,请排除当前表单的URL。如果没有历史记录,请确保设置默认值。

$_SERVER['HTTP_REFERER']有时会工作,但我遇到了很多问题,并且它在很多情况下都不起作用(刷新,来自同一页面,输入表单网址,来自电子邮件链接)等我个人严格避免它,因为如果你不小心它会导致不稳定的行为和重定向循环。事实上,我永远不会将它用于重定向。

答案 1 :(得分:1)

这个概念被称为Post-Redirect-Get。问题是:用户是否总是回到相同的静态原始页面,或者是否有许多页面可以引导用户访问此表单?如果后者为真,只需添加引用($_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']();
  ?>