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.
Show

eu sempre quis saber como fazer permalinks amigaveis com php mais nunca tive saco pra pesquisar e testar e tals
ai você aparece com a solução xD
show de bola Thiago
Ainda prefiro fazer com mod_rewrite…
Concordo com o Diego Henrique.
Além de preferir, acho bem mais elegante, prático e fácil.
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?
Fabio…você está usando apache ou iis?
se quiser, me envie um email que eu posso te ajudar mais detalhadamente!
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.