msgbartop
msgbarbottom

27 Oct 08 Redirecionamento 404 com PHP



Muitas vezes nos deparamos com urls do tipo “wyz.com.br?id=12&foto=1643″, quando poderiamos fazer uma url mais “bonita” e que é melhor interpretada por serviços de busca, como o google, como “wyz.com.br/carlos/brasil”. Poderiamos fazer isso de 2 jeitos: Um sistema de pastas e arquivos “index.php”ou um redirecionamento 404. Neste artigo vou explicar como fazer o redirecionamento 404 para os servidores Apache e IIS:

Para dizer ao servidor qual pagina acessar ao retornar um erro 404, temos que fazer da seguinte maneira:

Crie um arquivo que será utilizado como pagina personalizada para o erro 404. ex. “404-handler.php”.

Para o Apache: Crie um arquivo no diretorio raiz chamado “.htaccess” e coloque dentro dele o seguinte código: “ErrorDocument 404 /404-handler.php”. Sem as “aspas” e substitua o “/404-handler.php” pelo nome do arquivo que você ira criar para ser a pagina personalizada de erros 404.

Para o IIS: Indique no sistema de gerenciamento o caminho para o arquivo de erro 404 personalizado.

Abra o arquivo “404-handler.php”. As variaveis $_SERVER['REQUEST_URI'] e $_SERVER['QUERY_STRING'], dependendo do servidor, vão fornecer a requisição da página. Num servidor apache por ex., a váriavel $_SERVER['QUERY_STRING'] irá fornecer algo como “/jose/brasil”, enquanto que num servidor IIS, a váriavel $_SERVER['REQUEST_URI'] irá fornecer: “404;http://wyz.com.br/jose/brasil”. Utilize tratamento de strings como substr, explode para trabalhar com elas. Um ex. criado por mim:


if($_SERVER['QUERY_STRING'] != ""){
$querystring = explode(";", $_SERVER['QUERY_STRING']);
$qs = substr(parse_url($querystring[1], PHP_URL_PATH), 1); //Retira a primeira "/" da URL
}else{
$qs = substr($_SERVER['REQUEST_URI'], 1); //Retira a primeira "/"
}
while(substr($qs, -1) == "/")
$qs = substr($qs, 0, -1); //retira todas as "/" do final, para evitar problemas com o explode
$arr_qs = explode("/", $qs); //array contendo os niveis de requisição

Ao final desse código, uma url contendo no final “/jose/brasil” irá formar um array: $arr_qs[0] => “jose”, $arr_qs[1] => “brasil”

A partir dai, trabalhe com as informações que você conseguiu através da requisição e depois faça um “include(’index.php’)” (ou algum outro tratamento, dependendo de qual for a situação) ou retorne um 404 para caso a pagina requisitada deva retornar um 404 mesmo, através de:


header("HTTP/1.0 404 Not Found");

exit;

Tenha certeza de colocar o “exit;” após a tag header para evitar que qualquer outra informação adicional abaixo seja executada e também de não haver nenhuma informação impressa na tela, como algum “echo”, caso contrário a função “header” não irá funcionar.




Reader's Comments

  1. |

    Show :D
    eu sempre quis saber como fazer permalinks amigaveis com php mais nunca tive saco pra pesquisar e testar e tals :D
    ai você aparece com a solução xD
    show de bola Thiago ;)

  2. |

    Ainda prefiro fazer com mod_rewrite…

  3. |

    Concordo com o Diego Henrique.
    Além de preferir, acho bem mais elegante, prático e fácil.

  4. |

    Pra mim não funcionou :(
    apareceu a pagina de erro “404 Not Found”

    tem que por alguma permissão de execução ou algo assim?

  5. |

    Fabio…você está usando apache ou iis?

    se quiser, me envie um email que eu posso te ajudar mais detalhadamente!

  6. |

    Eu não entendi a utilidade de se mandar o robo de busca ou o usuario para um header 404.

    Acredito que essa é uma otima oportunidade de mandar um header location para sua index e mostrar assim que o link é valido.



Deixe um comentário