hacer un "breadcrumb" con htaccess
Hola phperos,
Estoy haciendo una aplicacion que sea util para buscadores, intento evitar navegar a traves del querystring:
<code>
index.php?familia=1&subfamilia=1...
</code>
He puesto en el root de la pagina un .htaccess
que gestiona los "404 not found" y los directorios de este modo
<code>
DirectoryIndex /midirectorio/index.php
ErrorDocument 404 /midirectorio/index.php
</code>
y luego en php hago un explode("/") de la ruta a la que se accede.
De este modo, consigo que "parezca" que se accede a un directorio cuando en realidad se aplica un documento 404.
Aunque intuyo que es una manera de trabajar de lo mas habitual, no se si este es el modo.
Mi duda es que si esto puede generar problemas de seguridad o bien si no es la solucion mas adecuada. He buscado y no he encontrado documentacion relacionada.
Saludos
meddle
Creo que estas mezclando conceptos, o no he sabido entenderte del todo. Una cosa es hacer que los 404 vayan a una pagina personalizada. Eso lo haces simplemente asi:
<code>ErrorDocument 401 /unDirectorioQueNoSeVea/401.php
ErrorDocument 403 /unDirectorioQueNoSeVea/403.php
ErrorDocument 404 /unDirectorioQueNoSeVea/404.php
ErrorDocument 500 /unDirectorioQueNoSeVea/500.php</code>
Lo que tu pides es que si una select no devuelve datos que lo haga pasar por un 404. No se si es muy acertado, pero no es exactamente lo mismo que un 404 real, porque para empezar estas enmascarando los 404 reales, y no lo veo muy logico. Yo haria que si la select devuelve cero datos suelte un mensaje de error, o algo asi, pero no soltaria un 404. No se si me he explicado, o igual no he entendido muy bien.
A riesgo de poner mi codigo a huevo a posibles hackers (... que interes podria tener? :P) puedo pasar como lo hago yo con las selects, no es muy ortodoxo pero a mi me funciona y creo que evito posibles malos usos. Luego lo pego si veo interes o que tiene relacion con tu pregunta.
meddle
Bueno la cosa iria por aqui. Ya se que gastas una select para comprobar que la query es valida, pero creo que es un paso que vale la pena en terminos de seguridad, aunque no estoy seguro que sea infalible, y mas colgandolo por aqui :P:
<code>// GET ALL VALUES FOR FIELD X AND STORE THEM IN AN ARRAY:
$query = "SELECT FIELDX FROM $MYTABLE";
$check = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($check)) {
$VALUESX[] = $row["FIELDX"];
}
// CHECK IF VALID QUERY:
// $QUERY COMES FROM URL/POST,etc.
if(in_array($QUERY, $VALUESX)) {
// DO YOUR STUFF
}
else {
echo ?you need a valid querysting?;
}
</code>
Podeis hacer la prueba en mi web. SI te lo curras un poco incluso puedes poner un script de comparacion de cadenas en el else, para devolver posibles valors parecidos. Tambien puedes verlo en mi web, ejemplo (ahi uso la funcion similar_text)
lemark
No va por ahí,
No estoy hablando de bbdd en principio, solo hablo de .htaccess y php para conseguir una foma de navegacion ajustada al proyecto que esta en desarrollo.
Un ejemplo. Ahora mismo en el querystring de esta pagina seguramente aparezca una querystring con
<code>
...?t=16078...
</code>
pues bien, quiero desarrollar una aplicacion en la que en vez navegar en funcion de lo que aparezca despues de la interrogacion, se navegue en una estructura de directorios:
<code>
.../16078/...
</code>
La forma que he expuesto, funciona pero no se si es optima.
Se hace en algunos portales y resulta util. No estoy inventando la rueda, quiero saber si hay una mejor manera de hacerlo.
meddle
ahhhhhh, ok. espera, a ver si doy con la rule adecuada, hace tiempo que no le doy a los htaccess. evidentemente, tienes que tener el modulo mod_rewrite instalado (aunque suele venir por defecto).
meddle
prueba esto (el RewriteRule en una sola linea):
<code>RewriteEngine on
RewriteRule ^\/midirectorio\/([^\/]*)\/([^\/]*)\/$ /midirectorio/index.php?familia=$1&subfamilia=$2 [L]</code>
pepevi
La solución es mod_rewrite, sin duda... pero ojo con los htaccess, se recomienda usar un <directory> en httpd.conf en la doc de apache. Si no tienes acceso a este archivo sólo te queda eso :)
lemark
Eso era justo lo q necesitaba. No puedo acceder a la configuracion del servidor pero no creo q genere muchos problemas de seguridad. Al final he optado por la siguiente expresion regular
<code>RewriteRule ^[A-Za-z0-9/]*$ index.php [t]</code>
Gracias, necesitaba ese empujoncito :-)
orange
Lo de hacer "redirecciones" a través de los 404 me parece poco elegante ... hace tiempo que lo lei en un artículo de A List Apart, en el que se hablaba de URLs.
De hecho daban las tres alternativas que habeis puesto aqui
- El 404: la menos recomendable
- Mod_rewrite: la más versátil
- Personalización de archivos: la mejor. Ya sé que tienes que tocar el http.conf, pero es mejor que el mod_rewrite, porque creo recordar que utilizando la reescritura se vuelve a hacer una petición al servidor (con la consiguiente carga). Si directamente configuras el servidor para que ejecute como PHP determinados archivos la cosa se resuelve antes.
De forma que cuando dás una URL dominio/directorio/trabajo ... tú tienes una pagina que se llama directorio (sin extension) que el apache ejecutará como PHP, y desde ella puedes acceder a la querystring para todo funcione mejor.
orange
Pues no era en A list Apart donde vi esas tres soluciones, era en Site Point
Este es el articulo de A List Apart http://www.alistapart.com/articles/urls/
Y este el de Site Point http://www.sitepoint.com/article/485
lemark
Ok,
el problema es que no tengo accesso a al http.conf, he intentado hacerlo tb via htaccess:
<code>AddType application/x-httpd-php index</code>
donde index es un script php, pero no me deja, sniff.
thanx por los enlaces ;-)