Foros del Web » Administración de Sistemas » Apache »

Errores personalizados con .htaccess

Estas en el tema de Errores personalizados con .htaccess en el foro de Apache en Foros del Web. Hola, buenas tardes... Pude realizar correctamente los errores personalizados, pero al respecto, me surge una duda. Hablando siempre del error 404 (página no encontrada) yo ...
  #1 (permalink)  
Antiguo 11/01/2012, 11:43
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Errores personalizados con .htaccess

Hola, buenas tardes...

Pude realizar correctamente los errores personalizados, pero al respecto, me surge una duda. Hablando siempre del error 404 (página no encontrada) yo hago:

ErrorDocument 400 http://www.misitio.com/error.htm

Y funciona perfecto, pero en la barra de direcciones aparece:
http://www.misitio.com/error.htm

En cambio, puedo ver que en algunos portales importantes, cuando ingresás cualquier url que no existe, mantiene dicha url pero aparece un error personalizado, como por ejemplo: http://www.lanacion.com.ar/fadasd.htm

Como hacen esto sin que se les modifique la url de la página personalizada ??
  #2 (permalink)  
Antiguo 11/01/2012, 11:51
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 6 meses
Puntos: 140
Respuesta: Errores personalizados con .htaccess

Esto es más de php que de apache (o almenos hasta donde llega mi conocimiento).

Por ejemplo, si trabajas páginas dinámicas y url's con traspaso de variables, y url amigables:

miweb.com/articulo1 ---> que sería ---> miweb.com/pagina.php?id=1 (mediante mod_rewrite)

si alguien entra a

miweb.com/articulo2 pero este no existe, en realidad el servidor interpretará miweb.com/pagina.php?id=2

Esta página sí que existe, por lo que ignora la linea de ErrorDocument

Para mandar el error, entonces, en pagina.php validas la variable id, y si no existe, mandas el error.

Si haces un header (location:404.php), te mandará a la página de error, pero es incorrecto ya que no mandas ningun header 404 not found, y google te puede indexar la página 404, puede ver que tienes varias redirecciones a esa página, etc etc.

Si haces lo correcto:

header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
include("404.php");
exit();

Se mantiene la url original, envías un header 404 not found, y muestra el contenido de error personalizado que tengas en el archivo 404.php (o error.htm en tu caso).

No se si me he explicado bien...

Saludos
  #3 (permalink)  
Antiguo 11/01/2012, 12:32
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Errores personalizados con .htaccess

Hola charlyalegret,

Antes que nada mil gracias.
Entedí a medias, es decir, la parte de los heraders entendí el funcionamiento.

Lo que no entendí es la otra parte. En mi sitio web, el usuario puede cambiar la url y poner cualquier cosa, y esa página por lo tanto no existe. No entiendo como hacer desde el .htaccess que cualquier pagina que no exista pueda tomar el error.

No sé bien donde colocar por ejemplo el código:
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
include("404.php");
exit();
  #4 (permalink)  
Antiguo 12/01/2012, 07:44
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 6 meses
Puntos: 140
Respuesta: Errores personalizados con .htaccess

Hola de nuevo!
mmm tienes conocimientos de php? si no és así y sólo trabajas con html, lo vas a tener complicado para mantener la url y mostrar la página de error...

El código enterior es de php. La idea, a ver si me explico mejor, es que si defines mediante el .htaccess una regla del estilo:

RewriteRule ^(.*) index.php?id=$1

Cualquier cosa que escribas en la url será interpretada por el archivo index.php, es decir, no cabe la posibilidad de que la página no exista.
És una forma habitual de trabajar con contenido dinámico. Por ejemplo, tu introduces la url:

miweb.com/articulo1

y el servidor mostrará esa url, pero interpretará pagina.php?id=articulo1

Esto, significa que irá a pagina.php, y la variable id valdrá "articulo1"

Con php, luego, puedes mostrar un contenido u otro según esa variable. Si vale "articulo1", pues muestras el articulo correspondiente. Si alguien se inventa la url, irá a la pagina.php con la variable id con el valor que hayan escrito en la url. Si no existe, con php, le puedes decir qeu muestre la pagina de error personalizada, con el código que he mostrado, manteniendo la url y con los headers correspondientes a not found 404.

Espero haberme explicado mejor! ;)
  #5 (permalink)  
Antiguo 12/01/2012, 09:03
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Errores personalizados con .htaccess

Gracias charlyalegret,

Entiendo bastante de PHP, según creo, tengo conocimiento bastantes avanzados de programación.

Te entendí perfecto, pero aún siendo una página dinámica, no todo se basa en una o dos páginas. Tengo muchas carpetas, y dentro subcarpetas con más páginas.

Es decir, mi web por ejemplo puede tener los siguientes enlances CORRECTOS:
http://www.miweb.com/productos/producto1.htm
http://www.miweb.com/seccion/seccion2.htm
http://www.miweb.com/clientes/pedro/index.htm
http://www.miweb.com/consultas.htm

Ahí te estoy mostrando varias niveles.

Entonces, si yo hago:
RewriteRule ^(.*) pagina.php?id=$1

Cuando ingresen a cualquiera de los 4 accesos que te puse como ejemplo, siempre se va a procesar "pagina.php"...

Y según entiendo de lo que decís, en esa pagina tengo que hacer todos los redireccionamientos y si no existe lo requerido, entonces mostrar las cabeceras y un mensaje de error, es así ??

No me queda claro, o no me convence, ya que si bien hay muchas páginas que se arman dinamicamente en mi sitio, muchas otras son estáticas y ni usan base de datos.
  #6 (permalink)  
Antiguo 12/01/2012, 11:10
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 6 meses
Puntos: 140
Respuesta: Errores personalizados con .htaccess

Sí! Lo que te ponía era un ejemplo general y sencillo porque no sabía si conocias php o no!
Evidentemente, la estructura de cada web puede ser mucho más compleja que eso.

Si trabajas de esa manera (todo a un archivo, y desde allí, incluyes un apartado u otro), entonces facilmente puedes mostrar siempre la página de error manteniendo la url. Wordpress, por ejemplo, trabaja así: Todo el tráfico va a una página, y ahí, le monta la cabecera y luego el contenido dependiendo de las variables de url.

En mi caso, por ejemplo, tengo la web como tu, trabajo con varias páginas y directorios, la malloría dinámicas, algunas estáticas. Por ejemplo, como trabajo con idiomas, tengo carpetas /es y /en. Ahí sí mediante htacess, dirigo todas las url a una página u otra, y si se escribe algo mal, pues no pasa la validación correspondiente y te muestra error manteniendo la url.

Por ejemplo, tengo:

Código Apache:
Ver original
  1. RewriteRule ^es/articulos/(.+)$ productes.php?variable1=$1&idioma=es [L]
  2. RewriteRule ^es/(.+)/(.+)$ seccions.php?variable2=$1&variable3=$2&idioma=es [L]
  3. RewriteRule ^es/(.+)$ altres.php?variable4=$1&idioma=es [L]

luego en cada uno de los archivos tengo al inicio algo como:

Código PHP:
Ver original
  1. $variable1= $_GET['variable1'];
  2. if ($variable1 == "muebles")
  3.     include('loquesea')
  4. elseif ($variable1 == "menaje")
  5.         include('loquesea2')
  6. else {
  7.     header("HTTP/1.0 404 Not Found");
  8.     header("Status: 404 Not Found");
  9.     include("404.php");
  10.     exit();
  11.     }

De esta manera:

Si entran en miweb.com/es/articulos/mueble ---> Ok!
Si entran en miweb.com/es/articulos/menaje---> Ok!
Si entran en miweb.com/es/articulos/motos---> No!! la página existe ya que me dirije a productes.php?variable1=motos&idioma=es
y productes.php existe. Pero según el if, lo que hago es mandar una cabecera 404 not found, incluyo el contenido de mi archivo personalizado de error, y se mantiene la url original. Es interesante porque además, desde por ejemplo google analytics ves que han accedido/intentado acceder a esa página, y puedes darte cuenta de errores o intentos raros de la gente.

Por otro lado, si alguien entra en miweb.com/articulos ---> no tengo ni un archivo llamado así, ni ninguna redirección: me mandará directamente a la página 404.php, por tener definido en .htaccess la linea
ErrorDocument 404 miweb.com/404.php

Saludos!
  #7 (permalink)  
Antiguo 13/01/2012, 19:40
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Errores personalizados con .htaccess

La respuesta es bastante más sencilla
El problema es que estás usando una url completa (protocolo incluido) en
Código Apache:
Ver original
  1. ErrorDocument 404 http://xxx.com/error.html

usa una ruta relativa al document_root

Código Apache:
Ver original
  1. errorDocument 404 /error.html
(por lo que error.html debera estar en la raiz)

y en la barra de direciones seguirá apareciendo la url del recurso solicitado, que corresponde a la variable del Server $REQUEST_URI

Una explicación detallada la vas a poder encontrar en
http://httpd.apache.org/docs/2.0/mod...#errordocument
SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #8 (permalink)  
Antiguo 14/01/2012, 03:54
Avatar de charlyalegret  
Fecha de Ingreso: septiembre-2011
Ubicación: Barcelona
Mensajes: 705
Antigüedad: 12 años, 6 meses
Puntos: 140
Respuesta: Errores personalizados con .htaccess



Emprenar, Muchísimas gracias, Contigo siempre aprendo algo nuevo!! Con todo el royo que yo me había montado solo

Saludos
  #9 (permalink)  
Antiguo 14/01/2012, 21:20
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Errores personalizados con .htaccess

Voy a probar lo que comenta emprear... ya que de ser así, sería una solución realmente muy buena.

Igualmente, gracias "charlyalegret", me ayudaste muchísimo.
Pruebo eso y aviso.
  #10 (permalink)  
Antiguo 16/01/2012, 08:00
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Errores personalizados con .htaccess

Hola emprear,

Entedí perfecto lo que explicas, pero al momento de hacerlo, no me lo toma correctamente. Es decir, escribo cualquier url errónea, y me salta el error clásico de 404 y además me agrega este renglón:

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

Es muy raro, no entiendo lo que sucede.
Mi .htaccess tiene esto:

Código HTML:
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
AddType application/x-httpd-php .htm
ErrorDocument 404 /error.htm
y en raiz , es decir, donde está la index de mi sitio, hay un archivo llamado "error.htm" que dentro solamente tiene una palabra, es decir que no tiene nada raro.... pero no me funciona.

Hay algo notorio que estoy haciendo mal ??
  #11 (permalink)  
Antiguo 16/01/2012, 11:44
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Errores personalizados con .htaccess

Un par de cosas
E lmensaje es nuy claro
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Significa que no encuentra /error.htm, por eso te muestra el mensaje de rerror por defecto de Apache
Si solo está haciendo lo del errorDocument, esto
RewriteEngine On
RewriteBase /

está demás
Tampoco es lo ideal que un error document tenga un tamaño inferior a los 512bytes, porque de ser asi Internet Explorer no muestra la página personalizada si no el mensaje de error del propio IE (que está definido en una dll de windows)
Te diría que revises las rutas y te asegures que .htaccess funciona, también es posible, aunque poco probable, que tu administrador esté limitando el uso de .htacces a algunas directivas solamente

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #12 (permalink)  
Antiguo 16/01/2012, 11:54
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Errores personalizados con .htaccess

Hola emprear,

Sigo teniendo el problema.
Hice algunos cambios respecto a lo que me dijiste, pero sigue sin funcionar.

El htaccess lo dejé solamente así:

Código:
Options +FollowSymlinks
ErrorDocument 404 /error.htm
y en raiz del sitio dejé el archivo "error.htm" con un montón de texto (para que ocupe bastante). Luego, coloco cualquier URL y me sale el mensaje clásico del error 404, y no muestra mi página personalizada.

Estoy usando y probando todo localmente, estoy usando el WampServer.

Que puede estar fallando ?
  #13 (permalink)  
Antiguo 16/01/2012, 11:55
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Errores personalizados con .htaccess

Ahhh disculpame, me olvidé de aclararte que está tomando y funcionando OK el .htaccess ... ya que antes de sacar todo, tenía otras reglas que funcionaban.

Saludos
  #14 (permalink)  
Antiguo 16/01/2012, 12:25
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Errores personalizados con .htaccess

Mirá, yo uso Xampp y una instalacion individiual de Apache, tengo definidos más de 20 VirtualHosts, y en todos me funciona. Puede que algún archivo de configuración de Wamp te esté sobreescribiendo los valores, tendría que analizar tus archivos .conf

Si intentás abrir
http://localhost/error.htm
que te muestra?


Te hice una pequeña prueba
en mi host http://foros.emprear.com
tengo en el htaccess

Código Apache:
Ver original
  1. ErrorDocument 404 /404.shtml
Que está en la raiz

En la carpeta /xml
cree un htacces para que sobreescriba la directiva con
ErrorDocument 404 http://foros.emprear.com/404.shtml

Probá las dos con algun archivo de nombre extraño (por ejemplo no tengo nada que se llame lospicapiedras.txt)
es decir
http://foros.emprear.com/lospicapiedras.txt
http://foros.emprear.com/xml/lospicapiedras.txt

y compara lo que aparece en la barra de direcciones
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #15 (permalink)  
Antiguo 16/01/2012, 14:59
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 2 meses
Puntos: 3
Respuesta: Errores personalizados con .htaccess

Hola emprear,

El ejemplo que pasaste funciona perfecto, y ya entiendo al 100% la diferencia entre poner una ruta relativa y otra absoluta en el .htaccess.

También, hice la prueba de subir todo a mi web tal cual te lo comenté a vos, y SORPRESA !!! efectivamente funcionaba OK, pero eso mism en mi servidor local no funcionaba.

Luego de pensar, supongo que al poner:
ErrorDocument 404 /error.htm

Y todo el sitio estar dentro de la famosa carpeta "www", no estaría tomando bien la ruta, ya que quizas en el .htaccess debo poner:
ErrorDocument 404 /misitio/error.htm

Y así fue, hice la prueba y funcionó perfecto !!!.

Gracias por la ayuda, y aún me quedan dudas respecto al motivo por el cual funciona en internet y no localmente.

Saludos
  #16 (permalink)  
Antiguo 16/01/2012, 16:35
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Errores personalizados con .htaccess

Probablemente en local, no tenes definidos bien los virtualhosts (si es que tenes definido alguno)
Lo importante es que te funcionó.

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: errores, htaccess, personalizados, url
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:35.