2010-06-16 4 views
3

연습 및 학습 경험으로 자체 MVC를 만들려고합니다. 지금까지, 이것이 내가 가지고있는 (index.php에) : 여기PHP, MVC, 404 - 404로 리디렉션 할 수 있습니까?

<?php 
require "config.php"; 

$page = $_GET['page']; 
if(isset($page)) { 
    if(file_exists(MVCROOT . "/$page.php")) { 
     include "$page.php"; 
    } else { 
     header("HTTP/1.0 404 Not Found"); 
    } 
} 


?> 

내 문제는 내가 헤더가 이미 전송 되었기 때문에 404에 보낼 헤더를 사용 할 수 없습니다. 404.html으로 리디렉션해야합니까, 아니면 더 좋은 방법이 있습니까? 지금까지 가지고있는 것을 비판 해보십시오 (거의 없습니다). 나는 제안과 아이디어를 좋아할 것이다. 감사! MVC 프레임 워크에서

+0

제거하거나' "사실는 isset"라인을'에코을 주석보십시오. – BoltClock

+0

아, 테스트 목적으로 사용하고있었습니다. 그걸 없애 줘. – Strawberry

+0

$ _GET [ 'page']가 '../../../../etc/passwd'이면 어떻게됩니까? (예 : http://example.com/index.php?page=../../../../etc/passwd) – dbemerlin

답변

6

표준 연습은 언제, 무엇을 사용자에게 전송되는 방식을 제어 할 output buffering (ob_start(), ob_get_contents()ob_end_clean())를 사용하는 것입니다.

이렇게하면 프레임 워크 출력을 캡처하는 한 원하는 때까지 사용자에게 전송되지 않습니다.

가 404을로드하려면 (예를 들어)를 사용하는 것입니다 : 도움이

<?php 
require "config.php"; 

$page = $_GET['page']; 
ob_start(); 

if (isset($page)) { 
    echo "isset is true"; 
    if (file_exists(MVCROOT."/$page.php")) { 
     include MVCROOT."/$page.php"; 
     $output = ob_get_contents(); 
     ob_end_clean(); 
     echo $output; 
    } else { 
     ob_end_clean(); //we don't care what was there 
     header("HTTP/1.0 404 Not Found"); 
     include MVCROOT."/error_404.php"; // or echo a message, etc, etc 
    } 
} 
?> 

희망을.

+0

고마워, 이거 맘에 들어! – Strawberry

+0

일부 404 메시지가 표시되기를 기대하지만 Firefox의 빈 페이지 일뿐입니다. 그것은 다른 브라우저에서 깨진 말한다. – Strawberry

+0

많은 경우 응답 코드와 함께 콘텐츠가 없으면 브라우저에서 자체 코드를 제공합니다. 머리글 뒤에 고유 한 404 페이지를 추가하십시오. 내 대답을 업데이트 할게. –

1

영어로 잘하지는 못하지만 시도하겠습니다. 어떤 코드를 실행하기 전에 서버에서 404 오류가 발생합니다 (페이지가 존재하지 않으므로 코드가 없기 때문에).

그래서 PHP 코드에서 오류를 찾는 404 오류를 사용자에게 제공하려면 404.html에 간단한 리디렉션을 사용해야합니다.

한편 서버 구성 파일에 액세스 할 수 있으면 서버에서 실행중인 웹 페이지 대신 서버에서이 파일을 프로그램 할 수 있습니다. 당신은 WAMP를 연습 할 수 ...

나는 당신이 나를 이해하기를 바랍니다. CyaA에

편집 내가 추가해야합니다

$ 페이지 = $ _GET [ '페이지'];

$ _GET [ 'page']가 설정되어 있지 않으면 오류가 발생하므로 사용을 시도하기 전에 isset ($ _ GET [ 'page'])을 확인해야합니다.

+0

편집 부분에 정확하게 동의하지 마십시오. – Strawberry

+1

@Doug, 오류는 발생하지 않지만 경고를 표시합니다. '$ page = isset ($ _GET [ 'page'])와 같은 일을해야합니까? $ _ GET [ 'page'] : null;'그런 식으로 경고는 발생하지 않으며'$ page'의 정확한 값을 알고 있습니다. '$ _GET [ 'page']'가 설정되어 있지 않은 경우. –

+0

thats 오른쪽, 오류, 경고 ... 여전히 영어 향상 :) – DomingoSL

0

리디렉션하거나를 포함해야 하나, 여기에 수정 된 코드 :

require "config.php"; 

$page = $_GET['page']; 
if(isset($page)) { 
    echo "isset is true"; 
    if(file_exists(MVCROOT . "/$page.php")) { 
     include MVCROOT . "$page.php"; 
    } else { 
     include MVCROOT . "404.html"; 
    } 
} 
+0

실제 HTTP 404 헤더가 완전히 사라진 상태에서 사용자에게 404 오류를 알리는 페이지가 포함됩니다. – BoltClock

+0

@BoltClock : 그렇습니다. 기본적으로 OP의이 문장입니다. ** 나는 404.html **로 리디렉션해야합니다. – Sarfraz

관련 문제