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.
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.
Respostas:
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.
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
Além de fornecer um cabeçalho 404, o PHP agora é responsável pela saída da página 404 real.
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.
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.
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?
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();
}
Desde o php 5.4 agora você pode fazer http_response_code(404);
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.
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.");
}
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
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");
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();
}
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: "".$_SERVER['REQUEST_URI']."", 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ê.
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
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>';