PHP 앱이 404 오류를 보내지 않는 이유는 무엇입니까?


140
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
}

왜 이것이 효과가 없을까요? 빈 페이지가 나타납니다.


1
더 나은 옵션은 404 상태를 보내고 사용자 정의 404 페이지를 즉시 포함시키는 것입니다. 그게 내가했던 일이야.
Rocky

내 PHP 서버에서 완벽하게 작동합니다. 위의 줄은 서버의 기본 404 페이지를 반환합니다. 이것이 서버에서 구성 될 수 있다고 가정합니다.
Elmue

답변:


306

코드가 기술적으로 정확합니다. 빈 페이지의 헤더를 보면 404 헤더가 표시되며 다른 컴퓨터 / 프로그램은 응답을 파일을 찾을 수 없음으로 올바르게 식별 할 수 있습니다.

물론 사용자는 여전히 SOL입니다. 일반적으로 404는 웹 서버에서 처리합니다.

  • User :이 URI 웹 서버에 저에게 필요한 것이 있습니까?
  • 웹 서버 : 아니요, 404입니다! 다음은 404에 표시 할 페이지입니다.

문제는 일단 웹 서버가 PHP 페이지 처리를 시작하면 404를 처리 할 지점을 이미 통과 한 것입니다.

  • User :이 URI 웹 서버에 저에게 필요한 것이 있습니까?
  • 웹 서버 : 예. PHP 페이지입니다. 응답 코드가 무엇인지 알려줍니다.
  • PHP : 야, OMG 404 !!!!!!!
  • Webserver : 404 페이지의 사람들이 이미 집에 돌아 왔기 때문에 PHP가 나에게 준 것을 보내겠습니다.

PHP는 404 헤더를 제공 할뿐만 아니라 실제 404 페이지를 출력합니다.


49
14 살짜리 소녀인지 아닌지, 작은 치즈 대화는 실제로 나에게 의미가 있습니다.
rbwhitaker

20
PHP 는 당시 14 세
Adam Lynch

1
스택 오버플로는 스타일을 위해 +1에 기능을 추가해야합니다. 이것은 모든 +1을 얻습니다.
Jay Querido

30
그것이 문서를 작성하는 방법입니다! 특히 내가 싫어하는 아파치 문서들 :)
Harry

4
피의 찬란하게 설명했다! 내 하루를 만들었다!
Andrei Cristian Prodan 9

78
if (strstr($_SERVER['REQUEST_URI'],'index.php')){
    header('HTTP/1.0 404 Not Found');
    echo "<h1>404 Not Found</h1>";
    echo "The page that you have requested could not be found.";
    exit();
}

마지막 두 개의 반향 선을 보면 내용이 표시됩니다. 원하는대로 사용자 정의 할 수 있습니다.


74

이것이 올바른 행동 입니다. 404 페이지의 컨텐츠를 작성하는 것은 사용자의 책임입니다.
404 헤더는 스파이더 및 다운로드 관리자가 파일이 존재하는지 확인하는 데 사용됩니다.
(404 헤더가있는 페이지는 Google 또는 다른 검색 엔진에 의해 색인이 생성되지 않습니다)

그러나 일반 사용자는 http- 헤더를 보지 않고 해당 페이지를 일반 페이지로 사용합니다.


20
FWIW, 404의 경우 IE는 내용이 짧은 경우 표준 '찾을 수 없음'페이지를 반환합니다 (서버가 '찾을 수 없음'이라고 가정하고 사용자에게 더 좋은 페이지를 표시하기로 결정 함).
Serge Wautier

16

레코드의 경우 이것은 모든 경우 처리기입니다.

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->

되어 die()필요?
Daniel은 Reinstate Monica가

아니요, 파일 상단에 해당 항목을 넣은 다음 사용자 정의 404 페이지로 진행하십시오.
Silviu-Marian

14

기본 서버 404 페이지를로드하십시오 (예 : 아파치에 대해 정의 된 경우).

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}

작동하지 않음, 경고 표시 : readfile (404missing.html) : 스트림을 열지 못했습니다 : 61 행의 /var/www/.com/public_html/index1.php에 해당 파일 또는 디렉토리가 없습니다

2
@AMB 그 파일을 직접 만들어야하기 때문입니다.
슈퍼 고양이

@SuperCat 감사합니다, 이제 오류를 다시 읽고 모든 것이 이제 명확합니다.,


4

@Kitet를 기반으로 한 또 다른 솔루션.

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
//If you don't know which web page is in use, use any page that doesn't exists
$handle = curl_init('http://'. $_SERVER["HTTP_HOST"] .'/404missing.html');
curl_exec($handle);

제어 할 수없는 서버에서 호스팅되는 웹 사이트를 프로그래밍하는 경우 "404missing.html"파일을 알 수 없습니다. 그러나 여전히이 작업을 수행 할 수 있습니다.

이러한 방식으로 동일한 서버에서 일반 404 페이지와 동일한 결과를 제공했습니다. 관찰자는 기존 PHP 페이지 리턴 404와 존재하지 않는 페이지를 구별 할 수 없습니다.


4

시도해보십시오 :

header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');

안녕!


2

조금 더 짧은 버전. 홀수 에코를 억제합니다.

if (strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  exit("<h1>404 Not Found</h1>\nThe page that you have requested could not be found.");
}

2
if($_SERVER['PHP_SELF'] == '/index.php'){ 
   header('HTTP/1.0 404 Not Found');
   echo "<h1>404 Not Found</h1>";
   echo "The page that you have requested could not be found.";
   die;
}

echo 문을 단순화하지 말고 위와 같이 세미콜론을 잊지 마십시오. 또한 페이지에서 substr을 실행하는 이유는 php_self를 쉽게 실행할 수 있습니다.


2
REQUEST_URI는 PHP_SELF와 동일하지 않기 때문입니다. 특히 URL 재 작성이있는 경우.
Timo Huovinen

1

서버의 기본 오류 페이지를 표시하려면 서버에서이 오류를 처리해야합니다.


1

정제를 사용할 수는 있지만 올바르게하고 있습니다. 이 문제가 해결 된 것처럼 보이므로 실용적인 응용 프로그램 이점에 대해 이야기 해 보겠습니다.

다국어 기술 문서 모음이 많은 오래된 웹 사이트에서 if 조건부에서이를 실행했습니다.

    if (<no file found>){
        die("NO FILE HERE");
    }

우리는 일반적으로 링크 크롤러 (우리의 경우 무결성)를 사용하여 잘못된 링크와 누락 된 문서를 체크 아웃한다는 문제 (유용하지 않은 메시지와 나쁜 사용자 경험 제외)입니다. 이것은 우리에게 파일이 있다는 것을 알려주는 200 개의 오류없는 응답이 완벽하게 있다는 것을 의미합니다. 무결성은 우리가 PDF를 기대한다는 것을 알지 못했기 때문에 PHP로 404 헤더를 수동으로 추가해야했습니다. 다이 위에 코드를 추가하면 (나중에 아무것도 실행되지 않고 헤더가 항상 렌더링 된 HTML 앞에 있어야하기 때문에) 무결성 (브라우저와 거의 비슷하게 동작 함)은 404를 반환하며 누락 위치를 정확히 알 수 있습니다 파일. 사용자에게 오류가 있음을 알리는 더 우아한 방법이 있습니다.

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");

1

이 시도:

if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
    echo "<head><title>404 Not Found</title></head>";
    echo "<h1>Not Found</h1>";
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    echo "<p>The requested URL ".$uri." was not found on this server.</p>";
    exit();
}

0

내 웹 사이트에서 다음과 같은 것을 만들었습니다.

        $uri=$_SERVER['REQUEST_URI'];
        $strpos=strpos($uri, '.php');
        if ($strpos!==false){
        $e404="The page requested by you: &quot".$_SERVER['REQUEST_URI']."&quot, doesn't exists on this server.";
        $maybe=str_replace('.php','',$uri);
        $maybe=str_replace('/','',$maybe);
        die("<center><h1>404</h1><hr><h3>$e404</h3><h3>Maybe try <a href=$maybe>www.leaveyortexthere.p.ht/$maybe</a>?</center>");

}

도움이 되길 바랍니다.


-4

이 문제가 발생했습니다. 서버의 기존 링크가 아닌 다른 링크로 리디렉션하면 문제가 해결 될 수 있습니다. 서버가 그의 404를 반환하기 때문에 :
header('Redirect abbb.404.nonexist');<존재하지 않습니다.


7
그렇게하면 302를 반환합니다. 404를 리디렉션하지 않는 것이 좋습니다. 대신 404 상태 코드를 사용하여 찾을 수없는 메시지를 표시하십시오.
Rocky

-17

서버의 기본 404 페이지를 표시하려면 다음과 같이 프레임에로드하십시오.

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';

4
이 사이트에서 본 최악의 답변에 대한 일종의 배지를 받아야합니다.
MadTurki

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.