2011-04-30 7 views
3

여러 페이지가 있습니다. 이 페이지에는 링크가 있습니다. 이러한 링크는 양식이있는 페이지로 연결됩니다. 양식이 제출되면 양식을 보유하는 페이지가 제출 된 데이터를 처리하기 위해 새로 고쳐집니다.양식 제출시 리퍼러로 리디렉션

여기에 질문이 있습니다.

양식이있는 페이지가 제출 된 데이터를 수신하고 처리하는 경우 사용자가 양식 페이지로 이동 한 페이지로 다시 이동해야합니다. PHP를 사용하여 어떻게 할 것입니까?

답변

3

(페이지 새로 고침, 양식 유효성 검사 실패 등의 여러 최근 항목을 피하십시오.) 기본적으로 사용자가 있었던 위치의 이동 경로입니다. 양식을 처리 할 때 - 사용자가 원하는 경우 현재 양식의 URL을 제외하고 가장 최근의 배열 값으로 사용자를 보냅니다. 기록이없는 경우 기본값을 설정하십시오.

$_SERVER['HTTP_REFERER'] 가끔은 잘 작동하지만 많은 문제가 있습니다 (새로 고침, 같은 페이지에서 오는 것, 양식 URL을 입력하는 것, 이메일 링크에서 오는 것 등).) 나는 그것을 조심하지 않으면 불규칙한 행동을 일으키고 리다이렉트 루프를 일으킬 수 있으므로 개인적으로이를 엄격히 피한다. 사실 나는 리디렉션을 위해 절대 사용하지 않을 것입니다.

+0

그것은 매우 흥미로운 접근 방법입니다. 그것은 다양한 문제를 해결하는 데 사용될 수있는 것 같습니다. 감사! –

+0

나는 개념을 알고 있다면 코드를 이해할 수 있다고 가정했다. 아마 맞을 까? 필요한 경우 코드를 공유 할 수 있지만 느릴 수 있습니다. 나는 그것을 vanilla php로 리버스 엔지니어링해야 할 것이다. –

+0

물론 알겠습니다. 다시 한 번 감사드립니다! –

1

이 개념을 Post-Redirect-Get이라고합니다. 문제는 사용자가 항상 같은 정적 원본 페이지로 돌아가는가 또는 사용자를이 양식으로 유도 할 수있는 페이지가 많은지 여부입니다. 후자가 사실이라면 간단히 referer ($_SERVER['HTTP_REFERER'])을 양식 요소로 추가하여 출처를 기록하십시오. PHP 코드 :

마지막 $_SESSION['history'] 항목이 현재의 URL를하지 않으면 내가 세션 변수 배열에 페이지가 "역사"라는 액세스 할 때마다 추가하면된다, 만 배열에 추가 할 무엇
<?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'](); 
    ?> 
+0

정말 아름다워요! 나는 쿠키를 사용하여 똑같은 일을 해왔으며 이것은 훨씬 더 우아합니다. 감사! –

+0

양식 데이터가 처음 유효하지 않고 양식 페이지가 두 번째로 새로 고쳐지면 작동하지 않습니다. –

+0

세션에서 사용자의 양식 데이터를 추적하기 만하면됩니다. GET에서 그 입력을 채 웁니다. 사용자는 지금 원하는만큼 새로 고칠 수 있으며 세션 데이터를 지우지는 않습니다. 나중에 할 수 있습니다. –

관련 문제