Hay que aceptar que no hay otra manera de lograr proyectos complejos que no sea basándose en progresos muy pequeños combinables, tomando en cuenta la limitación de la mente humana, que solo puede manejar muy pocas cosas a la vez, y solamente una principal al mismo tiempo, de forma funcional.
Escribir estos micro progresos demuestra que al final del día el avance y la cantidad de logros concretos es mucho mayor que esperando a completar un gran sistema para organizar ese conocimiento y crear un "diccionario" de pequeños trucos de verdades base (ground truths), e igualmente el aprendizaje y la corrección de errores se aceleran.
Como siempre, todo el contenido en este tema, que yo escriba, está bajo licencia de dominio público, y bajo la licencia Creative Commons 0 1.0 Universal (CC0), que equivale al dominio público, con respaldo legal.
Comienzo con un ejemplo de tipo snippet, que resulta ser la base que voy a usar para redirigir ejemplos mediante IDs pasados por URL.
__________________________________________________________
Convirtiendo un Error 404 en una Redirección Sin Error con PHP (Solo para GET, no para POST)
Requerimientos (2):
-PHP 5+
-Servidor configurado con una página PHP personalizada para el Error 404
En PHP, un error 404 hace que perdamos las variables de POST y GET.
Por lo menos, podemos todavía recuperar las variables GET mediante $_SERVER["REDIRECT_QUERY_STRING"] de forma manual, pero hasta donde sé, las variables POST sí se pierden con este método. Para POST, y otros casos, tal vez lo mejor sea usar mod_rewrite, aunque eso requiere ganar experiencia después de mucha prueba, error y entrenamiento, y por eso es que este snippet es valioso para quien no desee o no pueda manejar la complejidad de mod_rewrite.
Si ante un error 404 usamos la función de PHP header("Location: /alguna_URL"); antes de escribir cualquier contenido de documento al cliente, podemos convertir el error 404 No Encontrado en una condición sin error de redirección 301 Movido Permanentemente o 302 Encontrado.
Si a esto le sumamos el manejo manual de $_SERVER["REDIRECT_URL"] para indicar un script no existente, podemos combinar todo esto para crear una URL de búsquedas o de IDs de documento, como por ejemplo:
http://devel.no-ip.org/debree?id=0
En donde /debree no existe, pero que todavía podemos usar con este snippet.
Como se ve, una ventaja de este método es que podemos usar nombres GET de archivos SIN EXTENSIÓN, y sin la necesidad de configuración adicional al servidor, y con la opción de usar este truco o no, cuando lo necesitemos solamente.
Al inicio de nuestra página PHP para el manejo de errores 404, tendríamos:
Código:
<?php
//Aquí vamos a manejar el script inexistente
//"/debree":
///
if($_SERVER["REDIRECT_URL"]==="/debree")
{
//Como vemos en el IF anterior,
//$_SERVER["REDIRECT_URL"] solamente contiene
//el nombre del documento o script, sin contar la
//parte de la URL para el servidor, y tampoco las
//variables GET. Esto es ideal para detectar fácilmente
//si el nombre de script inexistente es el que estamos buscando.
//
//Si queremos que no distinga entre mayúsculas y minúsculas, podemos
//cambiar el código para que las discrimine; pero por ahora distinguir
//entre unas y otras nos da más posibilidades que si las discrimináramos.
///
//Creamos un arreglo que contiene cada una de
//las URLs para cada ID de virutas ("debrees" o "debris",
//un nombre especial para documentos que describen pequeñas
//combinaciones sintácticas, su valor y efectos, a partir del
//código de un programa).
//
//El ID 0, por "defecto", es el índice de nuestro sitio:
///
$debrees=Array(
"/"
);
//Aquí reorganizamos manualmente las variables GET.
//Reemplazamos todos los '&' por '=', y luego partimos la
//cadena $_SERVER["REDIRECT_QUERY_STRING"] (la cual contiene
//las variables URL GET) por cada '='.
//
//Con esto, sabemos que la cadena en el elemento de arreglo
//[$x+0] contiene el nombre de la variable URL GET, y
//el elemento del arreglo [$x+1] contiene el valor.
//
//Más adelante verificamos si realmente existe el valor del
//parámetro, y si no es así, evitamos seguir.
//
//Esta implementación la robusteceremos después, con el tiempo:
///
$z=str_replace("&", "=", $_SERVER["REDIRECT_QUERY_STRING"]);
$z=explode("=", $z);
//Esta variable indica si encontramos la viruta deseada.
//Si la encontramos, se pondrá en TRUE y evitará que mostremos
//el contenido normal de la página de error 404.
//
//Pero si no lo encontramos, permanecerá en FALSE y, convenientemente,
//desplegaremos el error 404.
///
$debree_flag_ok=FALSE;
//Recorremos todo nuestro arreglo manual de pares
//de variables/valores GET:
///
for($x=0;$x<count($z);$x+=2)
{
//Aquí nos interesa encontrar la variable GET "id":
///
if(strcmp($z[$x],"id")===0)
{
//Si encontramos la variable GET "id", vemos
//si su valor existe, viendo si tiene una longitud
//de más de 0 bytes, y después de asegurarnos de eso,
//vemos que la identificación numérica esté dentro del
//rango existente de URLs en nuestro arreglo de registros
//de URL, y que de hecho sea numérica con is_numeric.
///
if(strlen($z[$x+1])>0 && is_numeric($z[$x+1]) && ($z[$x+1]+0)<count($debrees))
{
//Aquí está nuestro truco principal.
//La siguiente línea convierte el error 404
//en una redirección:
///
header("Location: ".$debrees[$z[$x+1]]);
//Con esto indicamos que hemos encontrado nuestro
//documento, y no debemos mostrar el contenido
//de la página de error 404:
///
$debree_flag_ok=TRUE;
//Detenemos el bucle, para mayor eficiencia, o
//por lo menos como buena práctica de programación:
///
break;
}
}
}
//Si encontramos nuestra "viruta",
//nos detenemos aquí para no mostrar
//el error 404, lo cual no sería correcto
//en dicha condición.
///
if($debree_flag_ok) return;
}
?>
Ejemplo de URL que demuestra el uso de este código, que convierte el script inexistente en una URL de consulta válida:
http://devel.no-ip.org/debree?id=0
http://devel.no-ip.org/debree?id=0
http://devel.no-ip.org/debree?id=0
http://devel.no-ip.org/debree?id=0
http://devel.no-ip.org/debree?id=0
Si en lugar de redirigir la URL quisiéramos mostrar contenido válido en la página actual (por ejemplo, para evitar perder la URL escrita originalmente), necesitaríamos esforzarnos más y crear una aplicación PHP completa para el script no existente, manejada desde la página PHP para el manejo del error 404, con los principios que vimos aquí, y emulando un código HTTP 200 OK, que es más difícil de lograr que todo lo anterior, pero que también se logra básicamente con header("HTTP/1.0 200 OK"); y/o similares, además de otros elementos.