2009-08-10 1 views
5

어떻게 헤더 출력 오류가 발생하지 않고 아래의 설정으로 PHP에서 리디렉션 할 수 있습니까? 헤더가 설정되기 전에 브라우저에 아무 것도 인쇄 할 수 없다는 것을 알고 해결책을 찾고 있습니다. 이유에 대한 설명이 아닙니다.헤더 오류없이 PHP에서 리디렉션 할 수 있습니까?

<?PHP 
// include header 
include ('header.inc.php'); 



// In my body section file if this is a page that requires a user be logged in then 
// I run a function validlogin($url-of-page-we-are-on); inside of that file 
//the function is below, it outputs a redirect to login page if not logged in 

// include body of page we want 
include ('SOME-FILE-HERE.php'); 



// include footer 
include ('footer.inc.php'); 



// here is the function that is in the body pages, it is only called on a page that we require a logged in user so there are hundreds of pages that do have this and a bunch that don't, it's on a page to page basis 
function validlogin($url) { 
    if ($_SESSION['auto_id'] == '') { 
     $msg = 'Please login'; 
     $_SESSION['sess_login_msg'] = $msg; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     header("Location: /"); 
     exit(); 
    } 
} 
?> 

나는 사용자 PHP의 헤더 기능 싶습니다 아닌 메타, 자바 스크립트 리디렉션

답변

2

당신은이 작업을 수행 할 수 없습니다 :

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
?> 

<h1>Page heading</h1> 
...page content etc... 

<?php 
include ('footer.inc.php'); 
?> 
+0

그게 내가 한 짓을 내 질문의 업데이트 섹션을 읽으십시오 – JasonDavis

+0

미안 해요 같은 문제에 관한 또 다른 질문이 있었는데, 난 이걸 알고 있었어 어쨌든 그것은 내가 일찍 끝내고 결국 잘 했어. – JasonDavis

10

사용위한 ob_start 가능하면 또한 여기에 옵션을 로그인 여부를 필요 페이지 목록을하지 않습니다 maintainning()를 첫 줄에 포함시켜야합니다. 언제든지 헤더를 설정할 수 있습니다.

+0

위한 ob_start()하지만 난 그것을 사용 싫어이 문제를 해결 않습니다, 나는 더 나은 어떻게 작동하는지 이해하는 데 필요한 생각, 그것은 전체 페이지가 메모리에 저장하는 대신 바로 표시 할 필요 그것은 orrect? – JasonDavis

+0

은 직접적으로 아닙니다. PHP는 항상 출력 버퍼를 사용합니다. 그러나 그것은 다르게 작동합니다. 일반 버퍼는 언제든지 브라우저에서 flush 될 수 있습니다. 출력 버퍼링을 사용하는 데는 단 하나의 단점 만 있지만 flush()는 사용할 수 없습니다. – Rufinus

0

header() 함수 전에 스크립트 출력이 없으면 괜찮을 것입니다. 에코 나 공백이 없는지 확인하십시오. 또한 처음에 ob_start()를 사용하면 도움이 될 수 있습니다. 때로는 보이지 않는 공백이 있습니다 - 문서의 형식을 ANSI 또는 유니 코드로 변경하면 도움이 될 수 있습니다!

메모 (이미 알고 있다고 생각 하긴하지만) 헤더는 스크립트를 종료하지 않으므로 exit() (당신이 가지고 있음)가 확실한 요구 사항입니다.

+0

출력이 있습니다. 예를 들어, 로그인해야 할 페이지에 있는지 알기 전에 전체 헤더 파일 전체가 출력됩니다! – JasonDavis

+0

헤더가 포함되기 전에 반드시 validlogin() 함수가 호출되어야합니까? – Meep3D

+0

내가 언급 한 것처럼 불가능합니다. 모든 페이지가 로그인을 필요로하지 않고 페이지가 역동적으로 구축되었습니다. – JasonDavis

0

footer.inc.php 및 SOME-FILE-HERE.php가 응답 스트림에 즉시 씁니까? 왜냐하면 헤더를 보내기 전에 이미 뭔가를 작성 했으므로이 방법이 효과가 없기 때문입니다.

+0

정확히 이제 질문 =을 이해합니다.) – JasonDavis

+0

아, 글쎄, 그게 더 어려워집니다. :) 당신이 문제를 해결할 수 있기 때문에 당신이 명령을 내릴 때까지 프로세서가 응답을 캐싱하도록 강요하는 나의 삶을 위해서 그것을 기억할 수는 없습니다 ... –

+0

jasondavis, Gumbo의 대답은 올바르지 만 스크립트 끝에 ob_end_flush()를 호출하여 버퍼링 된 응답 스트림을 전송해야합니다. 기본적으로 ob_start(); // 포함하여 모든 코드를 포함합니다. ob_end_fush(); –

0

출력을 버퍼링하여 HTTP 헤더가 첫 번째 출력에 보내지지 않도록해야합니다. ouput_buffering을 활성화하거나 암시 적으로 ob_start을 호출하여 암시 적으로 출력을 버퍼링 할 수 있습니다. 그러나 후자는 첫 번째 출력 전에 호출되어야하므로 이상적으로 처음에 호출 된 스크립트의 첫 번째 줄에 있어야합니다.

0

이미 언급 한대로 ob_start() 또는 output_buffer을 사용하여 출력을 버퍼링합니다. 그 외에도 기능 코드의 중간에 콘텐츠를 출력하는 것은 좋은 관행이 아니라 내 관점에서 볼 때 다른 주제입니다.

자세한 내용은 Google 또는 this Article about Output Buffering in PHP에서 확인할 수 있습니다. 그게 가능하다면 당신이 결국 그래서는 "-여기에 몇 가지-FILE은"타입의 파일 모두에 포함 파일을 넣어

<?php 
validlogin($url); // call the function here 
include ('header.inc.php'); 
include ('SOME-FILE-HERE.php'); 
include ('footer.inc.php'); 
?> 

을 또는 :

2

사용 { echo '<META HTTP-EQUIV="Refresh" Content="0; URL=process.php">';}