2009-08-10 2 views
3

사용자를 리디렉션해야 할 때 PHP 파일에서 머리글이 이미 전송되어이 경우 사용자를 리디렉션하는 가장 좋은 방법 인 PHP의 헤더 기능을 사용할 수 없습니까?최고의 리디렉션 방법은 무엇입니까?

사용자 브라우저 브랜드에 관계없이 가장 빠르고 안정적인 방법은 무엇입니까?

echo '<script type="text/javascript">window.top.location="http://localhost/";</script>'; 

// OR 

echo '<meta http-equiv="refresh" content="0;url=' .$location. '">'; 

UPDATE 여기

내가 홈페이지로 리디렉션 할 수 없습니다 헤더가 이미 전송하는 경우 내가 지금 사용하고 내 최종 결과 코드는, 난 그냥 포함하는 대신 나에게 홈페이지를 가지고, 그래서 본문 페이지에는 내 홈페이지와 바닥 글이 포함됩니다.

function validlogin($url) { 
    if (!isset($_SESSION['auto_id']) || ($_SESSION['auto_id']=='')) { 
     $_SESSION['sess_login_msg'] = 'Please login'; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     if (headers_sent() === false){ 
      header("Location: /"); 
      exit(); 
     }else{ 
      //header is already sent so we will just bring the homepage to us instead of going to it!!! 
      include 'mainbody.inc.php'; 
      include 'footer.inc.php'; 
      exit(); 
     } 
    } 
} 

답변

4
function Redirect($url, $permanent = false) 
{ 
    if (headers_sent() === false) 
    { 
     header('Location: ' . $url, true, ($permanent === true) ? 301 : 302); 
    } 

    exit(); 
} 

Redirect('http://www.google.com/', false); 

다시, ob_start();

+0

이것은 올바른 길을 가고 있습니다. 내 솔루션 인 IDK가 왜 "출력 버퍼링"을 말하지 않는 사람이라도 누구나 downvoting을 유지하는지, 나는 그것이 누구인지를 잘 알고 있습니다. 귀하의 방법을 참조하십시오, 나는 기존의 기능에 추가 할 수 있습니다, 헤더가 이미 전송 된 경우, 그저 리다이렉트하는 대신 내 홈페이지를 포함시킬 수 있습니다. 훌륭한 솔루션입니다! – JasonDavis

+0

나는 기록을 위해 모든 나의 downvotes를 주장한다. 방법이 멋지게 작동하는 것처럼 보입니다. 이 게시물의 시작 부분에서 우리는 당신이 방향을 바꾸고 싶다는 것을 알고있었습니다. 더 많은 정보는 항상 더 좋습니다 :) –

-1

두 번째로 말할 것입니다.

사용자가 자바 스크립트를 사용하지 않거나 자바 스크립트가없는 브라우저를 사용하는 경우 첫 번째 리디렉션이 작동하지 않습니다.

+0

PHP에서 출력 버퍼링을 살펴볼 수도 있습니다. 이렇게하면 서버 측 리디렉션을 사용할 수 있습니다. http://us2.php.net/manual/en/ref.outcontrol.php – easement

+0

메타 리디렉션이 항상 지원되는지 궁금합니다. – JasonDavis

+1

어느 쪽이든 둘 다 뒤로 버튼을 죽입니다. –

7

다음 중 하나를 사용하지 마십시오! 항상 HTTP 리디렉션을 사용해야합니다.

콘텐츠를 버퍼링하고 이미 보낸 헤더 문제를 방지하려면 ob_start()을 사용하십시오.

아무 것도 출력하기 전에 리디렉션해야하는지 여부를 알 수있는 MVC 애플리케이션을 작성하려고 할 수도 있습니다 (단, ob_start()은 필요하지 않음).

+0

동의합니다. 응용 프로그램의 출력을 제어하고 HTTP 헤더를 사용할 수 있어야합니다. 이 작업을 수행 할 수 없다면 두 번째 옵션을 사용하십시오. 이 답변 +1. –

+0

ob 버퍼 작동 방식에 대해 많이 알지 못하지만 표시하기 전에 전체 페이지를 메모리에 넣지는 않습니다. 트래픽이 많은 사이트에서 성능이 좋지 않을 수 있습니까? – JasonDavis

+0

일부 테스트에서는 작은 출력이 많다는 사실이 발견되면 더 큰 배치 iirc보다 느립니다. 인터넷 검색이나 테스트가 필요합니다. – OIS

2

다시 porneL에 돼지 : 당신의 방법에

거대한 문제 : 당신은 뒤로 버튼을 죽일. 뒤로 버튼을 죽이는 것은 웹에서 가장 짜증나는 일입니다.

헤더를 보낸 후에 리디렉션 할 필요가 없습니다. 아마도 당신이하려고하는 것을 재고해야합니다.

+1

전적으로 동의합니다. 출력 한 후에 헤더를 보내야하는 경우 잘못 처리하는 것입니다. – usoban

+0

내 경우에는 리디렉션하는 유일한 시간은 양식을 제출 한 후 또는 사용자가 로그 아웃 한 경우 로그인 페이지로 리디렉션되므로 뒤로 버튼을 사용해서는 안됩니다. – JasonDavis

+0

또한 헤더가 전송되는 이유는, 헤더 파일은 헤더 파일 아래에 있습니다. 헤더 파일에 헤더 파일이 있습니다. 이제는 일부 페이지에만 사용자가 로그인해야합니다. 그래서이 페이지에서 로그인 여부를 확인하는 함수를 호출합니다. 리디렉션을 시도합니다. 따라서 본문 파일에 있기 때문에 헤더가 이미로드 된 후 – JasonDavis