Como posso criar um erro 404 no PHP?

111

Meu .htaccess redireciona todas as solicitações para /word_herepara /page.php?name=word_here. O script PHP então verifica se a página solicitada está em sua matriz de páginas.

Se não, como posso simular um erro 404? Eu tentei isso, mas não resultou na minha página 404 configurada via ErrorDocumentno .htaccessaparecendo.

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

Estou certo em pensar que é errado redirecionar para minha página de erro 404?

Eric
fonte
Por que você quer dizer que não funciona? Você verificou o cabeçalho de resposta do servidor?
Gumbo,
1
Em resposta à sua pergunta final, sim, seria uma má ideia redirecionar todos os 404s para uma página real. Isso viola a especificação HTTP ao transformar algo que não deveria estar lá em algo que está lá.
Lucas Oman,

Respostas:

157

A resposta atualizada (a partir do PHP 5.4 ou mais recente) para gerar páginas 404 é usar http_response_code:

<?php
http_response_code(404);
include('my_404.php'); // provide your own HTML for the error page
die();

die() não é estritamente necessário, mas garante que você não continue a execução normal.

lâmina
fonte
em qual arquivo devo adicionar isso?
Julfikar de
87

O que você está fazendo funcionará e o navegador receberá um código 404. O que ele não fará é exibir a página "não encontrado" que você esperava, por exemplo:

Não encontrado

O URL solicitado /test.php não foi encontrado neste servidor.

Isso porque o servidor web não envia essa página quando o PHP retorna um código 404 (pelo menos o Apache não envia). O PHP é responsável por enviar toda a sua própria saída. Portanto, se você quiser uma página semelhante, terá que enviar o HTML você mesmo, por exemplo:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

Você pode configurar o Apache para usar a mesma página para suas próprias mensagens 404, colocando isso em httpd.conf:

ErrorDocument 404 /notFound.php
JW.
fonte
Obrigado. Eu presumi que ele usava minha página 404.
Eric,
@JW onde o código acima será usado? é aquele código para o arquivo '.htaccess'.
Manohar Kumar de
@ManoharKumar acima use o código para onde deseja enviar a página 404. No meu caso, usei quando alguém procura um item com seu código, mas ele não existia. então utilizo o código acima após descobrir que o item não está disponível e também usei exit na 3ª linha deste código, para evitar carregar qualquer coisa após a página 404. obrigado JW, funcionou perfeitamente para mim.
Harsha de
22

Experimente isto:

<?php
header("HTTP/1.0 404 Not Found");
?>
Ates Goral
fonte
3
Bem, um 404 é um 404 em HTTP 1.0 e 1.1. 1.0 é uma aposta segura. Piada legal BTW :) +1
Ates Goral
no meu caso tenho que dar o cabeçalho ("Local: HTTP / 1.0 404 não encontrado");
The EasyLearn Academy
9

Crie páginas de erro personalizadas por meio do arquivo .htaccess

1. 404 - página não encontrada

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Erro interno do servidor

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Proibido

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Pedido inválido

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Autorização necessária

RewriteEngine On
ErrorDocument 401 /401.html

Você também pode redirecionar todos os erros para uma única página. gostar

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
Irshad Khan
fonte
O RewriteEngine não tem nada a ver com isso; essa linha pode ser omitida com segurança para obter o mesmo resultado.
WoodrowShigeru
3

Você se lembrou de morrer () após enviar o cabeçalho? O cabeçalho 404 não para automaticamente o processamento, portanto, pode parecer que nada foi feito se houver processamento adicional acontecendo.

Não é bom REDIRECIONAR a sua página 404, mas você pode INCLUIR o conteúdo dela sem problemas. Dessa forma, você tem uma página que envia corretamente um status 404 do URL correto, mas também tem o seu "o que você está procurando?" página para o leitor humano.

Eli
fonte
0

tente colocar

ErrorDocument 404 /(root directory)/(error file) 

no .htaccessarquivo.

Faça isso para qualquer erro, mas substitua 404 pelo seu erro.

o crafteryt vermelho
fonte
0

No Drupal ou Wordpress CMS (e provavelmente em outros), se você estiver tentando fazer algum código php personalizado parecer não existir (a menos que alguma condição seja atendida), o seguinte funciona bem fazendo com que o manipulador 404 do CMS assuma o controle:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>
Mike Godin
fonte
-2

Imediatamente após essa linha, tente fechar a resposta usando exitoudie()

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

ou

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
user5891645
fonte
1
Se você fizer isso, o usuário verá uma página vazia. Minha dúvida era como enviar a mesma página 404 que especifiquei ErrorDocument, mas do PHP.
Eric
se você quiser usar ErrorDocument Certifique-se de que o caminho para seu arquivo de erro personalizado é em relação à raiz do exemplo do servidor: digamos que seu caminho virtual é / folder1 / folder2 / myhtaccess da raiz do servidor seu errordocument será parecido com este ErrorDocument 404 /folder1/folder2/my404.html
user5891645
ErrorDocumentnão tem nenhum efeito depois que você já inseriu o código PHP. esta resposta explica melhor a confusão que enfrentei há 9 anos
Eric
Espero que seu problema esteja resolvido agora. Por falar nisso, acho melhor você não redirecionar com? Name = word_here. Em vez disso, use $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");em seu arquivo page.php. Porque há um cenário em que uma dessas páginas está esperando uma consulta "nome" do usuário.
user5891645
-2

tente uma vez.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Mani Kandan
fonte