2011-05-10 3 views
14

데이터베이스에 페이지가 있는지를 찾기 위해 URI를 처리해야하는 webapp가 있습니다.PHP에서 Apache의 기본 404 페이지를 표시하는 방법

Options +FollowSymlinks 
RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?p=$1 [NC] 

내 문제는 페이지가 존재하지 않는 경우, 내가 PHP로 작성된 사용자 정의 (404) 핸들러를 사용하지 않는다는 것입니다, 내가 좋아하는 것 : 나는 htaccess로와 응용 프로그램에 URI를 지시 아무런 문제가 없다 기본 Apache 404 페이지를 보여줍니다. PHP가 페이지가 존재하지 않는다고 판단되면 실행을 다시 Apache로 넘길 수있는 방법이 있습니까?

+0

아니요. 'header ('Location : ...') '를 통해 404 페이지로 간단한 리다이렉션을 할 수는 있지만'200 OK '요청으로 표시됩니다. 이는 불량 사례로 간주됩니다. –

+1

도움이 될 수 있습니다. http://stackoverflow.com/questions/4232385/php-or-htaccess-make-dynamic-url-page-to-go-404-when-item-is-missing-in-db –

+0

아직 쉬운 옵션이 없다고 생각합니다. http://stackoverflow.com/q/4856425/345031 – mario

답변

5

나는 위의 시나리오에서 PHP 코드의이 유형을하는 것입니다에 대한 인식하고있는 유일한 방법 당신의 index.php :

<?php 
if (pageNotInDatabase) { 
    header('Location: ' . $_SERVER["REQUEST_URI"] . '?notFound=1'); 
    exit; 
} 

그리고 약간 같이 당신의 .htaccess를 수정 :

Options +FollowSymlinks -MultiViews 
RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !notFound=1 [NC] 
RewriteRule ^(.*)$ index.php?p=$1 [NC,L,QSA] 

그런 식으로 아파치는 PHP 코드에서 추가 된 쿼리 매개 변수 ?notFound=1과 부정적인 체크로 인해이 특별한 경우에 대해 기본 404 페이지를 보여줍니다 .htaccess 페이지에서 다음 번에 index.php로 전달되지 않습니다.

PS : /foo 같은 URI를 데이터베이스에서 찾을 수없는 경우 브라우저에서 /foo?notFound=1 될 것입니다.

+0

이것은 404 핸들러에서 이것을 호출하면 반복됩니다. – Mel

+0

'header ('Location :/존재하지 않는 -page-url');은 사용자 정의 404 핸들러에서 가져온 것이 아닙니다. 내 대답을 참조하십시오, 위의 index.php 썼습니다. 사실 아파치의 404 핸들러를 보여주고 싶다면 커스텀 404 핸들러를 가지고 있지 않아야한다. 나는 당신의 아파치 설정이나 .htaccess 파일에서'ErrorDocument 404'를 주석 처리 할 것을 제안합니다. – anubhava

+0

아, 내 잘못이야. 원래 질문을 잘못 읽었습니다. – Mel

4

콜이 기능 : 당신이 아파치에 "그것을 다시 손"수 있다고 생각하지 않습니다,하지만 당신은 이런 식으로 404 파일을 적절한 HTTP 헤더를 보낸 다음 명시 적으로 포함 할 수

http_send_status(404); 
+9

이것은 설치할 수없는 pecl_http 패키지가 필요합니다. – andrewtweber

+2

좋은 관찰. –

+2

좋은 관찰 –

14

:

if (! $exists) { 
    header("HTTP/1.0 404 Not Found"); 
    include_once("404.php"); 
    exit; 
} 

업데이트

PHP 5.4 remem이 좀 더 쉽게 만드는 http_response_code 기능을 도입 맥주.

if (! $exists) { 
    http_response_code(404); 
    include_once("404.php"); 
    exit; 
} 
관련 문제