Por que meu aplicativo PHP não envia um erro 404?


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

Por que isso não funciona? Eu recebo uma página em branco.


1
A melhor opção seria enviar um status 404 e incluir sua página 404 personalizada imediatamente. Isso é o que eu costumava fazer.
Rocky

No meu servidor PHP, ele funciona perfeitamente. A linha acima retorna a página 404 padrão do servidor. Suponho que isso possa ser configurado no servidor.
Elmue # 7/14

Respostas:


306

Seu código está tecnicamente correto. Se você observasse os cabeçalhos dessa página em branco, veria um cabeçalho 404, e outros computadores / programas conseguiriam identificar corretamente a resposta como arquivo não encontrado.

Obviamente, seus usuários ainda são SOL. Normalmente, 404s são tratados pelo servidor web.

  • Usuário: Ei, você tem alguma coisa para mim neste servidor URI?
  • Servidor da Web: Não, não, 404! Aqui está uma página para exibir os 404s.

O problema é que, assim que o servidor da Web começa a processar a página PHP, já passou do ponto em que ele manipularia um 404

  • Usuário: Ei, você tem alguma coisa para mim neste servidor URI?
  • Servidor da Web: Sim, sim, é uma página PHP. Ele informará qual é o código de resposta
  • PHP: Ei, OMG 404 !!!!!!!
  • Servidor da Web: Bem, porcaria, as pessoas da página 404 já foram para casa, então enviarei tudo o que o PHP me deu

Além de fornecer um cabeçalho 404, o PHP agora é responsável pela saída da página 404 real.


49
Menina de 14 anos ou não, a pequena caixa de diálogo de queijo realmente fazia sentido para mim.
Rbwhitaker 08/04

20
O PHP tinha 14 anos naquela época
Adam Lynch

1
O estouro de pilha precisa adicionar funcionalidade a +1 para obter estilo. Isso obteria todos os + 1s.
Jay Querido

30
É assim que a documentação deve ser escrita! Especialmente documentação do Apache, que eu realmente odeio :)
Harry

4
sangrenta brilhantemente explicado! fez o meu dia!
Andrei Cristian Prodan

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();
}

Se você olhar as duas últimas linhas de eco, é aí que você verá o conteúdo. Você pode personalizá-lo como quiser.


74

Esse é o comportamento correto , você deve criar o conteúdo da página 404.
O cabeçalho 404 é usado por spiders e gerenciadores de download para determinar se o arquivo existe.
(Uma página com um cabeçalho 404 não será indexada pelo Google ou por outros mecanismos de pesquisa)

Usuários normais, no entanto, não olham para os cabeçalhos http e usam a página como uma página normal.


20
FWIW, no caso de 404, o IE retorna sua página padrão 'não encontrada' se o conteúdo for curto (pressupõe que o servidor está apenas dizendo 'não encontrado' e decide exibir uma página melhor para o usuário).
Serge Wautier

16

Para o registro, este é o manipulador de todos os casos:

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

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

é die()necessário?
Daniel diz Reinstate Monica

Não, basta colocar essas coisas na parte superior do arquivo e prosseguir com uma página 404 personalizada.
Silviu-Marian

14

Carregue a página 404 do servidor padrão, se você tiver uma, por exemplo, definida para o apache:

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

não está funcionando, está sendo exibido Aviso: readfile (404missing.html): falha ao abrir o fluxo: não existe esse arquivo ou diretório em /var/www/.com/public_html/index1.php na linha 61

2
@ AMB Isso é porque você mesmo deve criar esse arquivo.
Super Cat

@SuperCat graças, agora eu reli o erro e tudo está claro agora,.


4

Outra solução, baseada no @ Kitet's.

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);

Se você estiver programando um site hospedado em um servidor, você não tem controle, não saberá qual arquivo é o "404missing.html". No entanto, você ainda pode fazer isso.

Dessa maneira, você forneceu exatamente o mesmo resultado de uma página 404 normal no mesmo servidor. Um observador não poderá distinguir entre uma página PHP existente retorna 404 e uma página inexistente.


4

tente com:

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

Tchau!


2

Uma versão um pouco mais curta. Suprimir eco estranho.

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;
}

nunca simplifique as instruções de eco e nunca esqueça o ponto-e-vírgula como acima, também porque executar um substr na página, podemos facilmente executar php_self


2
porque REQUEST_URI não é o mesmo que PHP_SELF. Especialmente se você tiver reescrita de URL.
Timo Huovinen

1

Se você deseja que a página de erro padrão do servidor seja exibida, você deve lidar com isso no servidor.


1

Você está fazendo certo, embora possa usar algum refino. Parece que isso foi resolvido, então vamos falar dos benefícios práticos do aplicativo:

Um site antigo nosso, que possui uma grande coleção de documentos técnicos multilíngües, estava executando isso dentro de uma condição condicional:

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

O problema (além da mensagem inútil e da má experiência do usuário) é que geralmente usamos um rastreador de links (na nossa integridade) para verificar links ruins e documentos ausentes. Isso significa que estávamos recebendo uma resposta 200 sem erros perfeitamente correta nos dizendo que havia um arquivo lá. A integridade não sabia que estávamos esperando um PDF, então tivemos que adicionar manualmente um cabeçalho 404 com php. Ao adicionar seu código acima do dado (porque nada depois seria executado e o cabeçalho sempre deveria estar antes de qualquer html renderizado), a integridade (que se comporta mais ou menos como um navegador) retornaria um 404 e saberíamos exatamente onde procurar por falta arquivos. Existem maneiras mais elegantes de informar ao usuário que há um erro,

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

1

Tente o seguinte:

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

Você sabe, no meu site eu criei algo como isto:

        $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>");

}

Espero que ajude você.


-4

Eu vim para esse problema. Acho que o redirecionamento para um link inexistente no servidor pode ajudar! Como o servidor retornaria seu 404:
header('Redirect abbb.404.nonexist');<isso não existe com certeza


7
Isso também retornaria um 302 se você fizer isso. Melhor não redirecione seus 404. em vez disso, use o código de status 404 e exiba a mensagem não encontrada.
Rocky

-17

Se você deseja mostrar a página 404 padrão do servidor, pode carregá-la em um quadro como este:

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

4
Isso deve receber algum tipo de distintivo para a pior resposta que eu já vi neste site.
21414 MadTurki

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.