Foros del Web » Programando para Internet » Javascript »

¿Cómo saber si una url "ajena" devuelve 404?

Estas en el tema de ¿Cómo saber si una url "ajena" devuelve 404? en el foro de Javascript en Foros del Web. Hola que tal, Estoy haciendo una aplicación en la cual es necesario almacenar links externos, es decir, que no pertenecen al nombre de dominio del ...
  #1 (permalink)  
Antiguo 09/05/2012, 17:21
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Busqueda ¿Cómo saber si una url "ajena" devuelve 404?

Hola que tal,

Estoy haciendo una aplicación en la cual es necesario almacenar links externos, es decir, que no pertenecen al nombre de dominio del servidor y checar si están caídos.

Por lo visto es necesario saber que estado http devuelve, solamente quiero saber si me dan 404.

El problema es que no encuentro forma de obetener la informacion ya que los links son de diferentes dominios y las politicas de los navegadores no te dejan acceder a ellos.

Ya he utilizado peticiones con AJAX pero me devuelven status 0 con readyState 4.

Tambien he utilizado ventanas e iframes para tomar el window.location pero no me dejan convertirlo a string por que tambien va contra las politicas. Si aunque sea me dejaran tomar el window.location como string podria hacer una comparacion para saber si el path del dominio cambio.

Hay alguna otra forma que no conozca que si funcione?

Si alguien me pudiera ayudar para aplicar con esto con javascript estaria muy agradecido, haber si alguie se sabe algun truco.

Si esto parece ser imposible, me interesaria que me dijera si es posible hacerlo con php, por que al menos podria mandar los links a un archivo php para que los analize.

Estare al pendiente, saludos y gracias.
  #2 (permalink)  
Antiguo 09/05/2012, 20:02
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Tu mismo has dicho que los navegadores no permiten hacer peticiones ajax a servidores externos, realmente ignoro que con ajax crossdomain se pueda, pero lo ideal es hacer esa comprobación en el servidor, con cURL por ejemplo
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 09/05/2012, 21:12
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Debe haber un truco, estoy seguro, pienso que tendría que recurrir a php para buscar alguna función que me devuelva las cabezeras de respuesta de una página, posiblemente allí si me las devuelva aunque sea otro dominio, pero desconozco que función o funciones podrían ser.

También debe haber algún "custom" navegador que ignore estas tontas políticas, o alguna forma de modificar mi navegador, pero eso ya es otra cosa, por eso insisto en este tema por que alguien debe saber una solución.

Sigo en espera, :P
  #4 (permalink)  
Antiguo 10/05/2012, 09:26
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

asi
Código PHP:
Ver original
  1. <?php
  2. function gh($url){
  3. $encabezados = @get_headers($url);
  4. if (preg_match("|200|", $encabezados[0])) {
  5. echo "ok 200<br />";
  6. } elseif(preg_match("|404|", $encabezados[0])) {
  7. echo "no existe 404";
  8. }else{
  9. echo "otro error";
  10. }
  11. }
  12. echo "<p>ok</p>";
  13. gh("http://emprear.com/");
  14. ?>
  15. <hr>
  16. <?php
  17. echo "<p>no existe</p>";
  18. gh("http://emprear.com/zxzxzxzx");
  19. ?>
  20. <hr>
  21. <?php
  22. echo "<p>Un dominio que no existe (nocreoqueestedominioexista.com)</p>";
  23. gh("http://nocreoqueestedominioexista.com/zxzxzxzx");
  24. ?>

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 10/05/2012, 09:32
 
Fecha de Ingreso: septiembre-2011
Ubicación: Yucatán
Mensajes: 42
Antigüedad: 13 años, 3 meses
Puntos: 8
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Emprear, la verdad no se me ocurre una cosa buena para saber si una url devuelve 404, si no es para:

lanzar atakes, para detectar vulneravilidades en una pagina.
o
crear un boot, que este revisando pag x pag, para robar emails.

Aclaro que no importando esto es importante que el programador proteja estos dos agujeros.
  #6 (permalink)  
Antiguo 10/05/2012, 09:43
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

@villano4
tus conclusiones son completamente equivocadas, no se puede realizar esa afirmación.
Obtener los encabezados de una página es una acción que se utiliza frecuentemente para una infinidad de situaciones.
una que se me ocurre ahora
Creamos un perfil de usuario
Pedimos que se ingrese
nombre/Apellido/dirección url de su página personal

guardo el nombre,
guardo el usuario
chequeo la existencia de la url
si existe (status 200) la guardo, si no envío una advertencia

Algo paranoica tu conclusión

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #7 (permalink)  
Antiguo 10/05/2012, 10:07
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

cierto, saber que exista no quiere decir que sea vulnerable, al final si no proteges tu sistema la vulnerabilidad persiste
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #8 (permalink)  
Antiguo 10/05/2012, 11:01
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Wow muchas gracias @emprear, queria que la solucion fuese con javascript pero eso ya es mucho asi que nimodo mando los links por php para que me los cheque, la verdad que estoy muy muy agradecido. Imaginense ya tenia 600 lineas de codigo bien pensadas y nunca me imagine que iva a haber un problema tan comun con las politicas de javascript , lo bueno que ya puedo continuar con mi projecto, gracias :)
  #9 (permalink)  
Antiguo 10/05/2012, 13:58
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

:((((((((((((((((, Acabo de probar el get_headers, pero no sirve del todo ya que muchas paginas hacen redirecciones cuando deberia haber un 404, y al final no logras saber si hubo 404 cuando el url tiene consultas GET y hace redirecciones.

Definitivamente, necesitaria usar javascript para estar 100% de que la pagina no existe para lo que es mi programa.

Lo unico que me quedaria es hacer un metodo poco automatizado ya que tendria el usuario que estar copiando y pegando codigo entre paginas.

Si alguien tiene algun metodo mejor incluso si con PHP hay una mejor manera, estare muy agradecido que compartan esa informacion.
  #10 (permalink)  
Antiguo 10/05/2012, 15:56
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

olvidate con javascript, no se puede.
No sé exactamente que es lo que necesitas

probá con

<?php
$f = @fopen('http://www.foros.emprear.com','r');
if($f !== false){
echo "existe";
}else{
echo "no existe";
}
?>

en el ejemplo en particular yo tengo hecho una redirección 301 de www a no www, y no impide saber si el recurso existe o no

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #11 (permalink)  
Antiguo 11/05/2012, 10:19
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Gracias emprear, siento contradecirte pero encontre una forma de acceder al contenido de otro dominio usando javascript e iframes en firefox, simplemente tengo que habilitar el privilegio "UniversalXPConnect" antes de acceder al contenido y vualá ya puedo acceder aunque sea de otro dominio!

Aqui un ejemplo:

Código Javascript:
Ver original
  1. // Suponiendo que mi dominio es foo.com y el dominio del iframe es bar.com
  2.     var TheIframe = window.TheIframe;
  3. // Sin privilegio
  4.     console.log(TheIframe.location.toString()); // Permission Denied
  5.     console.log(TheIframe.document); // Permission Denied
  6. // Con privilegio
  7.     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");// Damos en recordar decisión para que no salga el mensaje de nuevo.
  8.     console.log(TheIframe.location.toString()); // bar.com
  9.     console.log(TheIframe.document); // [Object HTMLDocument]

See...
  #12 (permalink)  
Antiguo 11/05/2012, 10:57
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Consola de Firefox

Con url externa
[13:48:06.336] GET http://emprear.dnsd.info/varios7/TheIframe.html [HTTP/1.1 200 OK 4ms]
[13:48:06.434] Permission denied to access property 'toString' @ http://emprear.dnsd.info/varios7/TheIframe.html:14

Con archivo dentro del dominio
[13:49:47.815] GET http://emprear.dnsd.info/varios7/TheIframe.html [HTTP/1.1 200 OK 8ms]
[13:49:47.849] GET http://emprear.dnsd.info/varios7/x.html [HTTP/1.1 200 OK 4ms]
[13:49:47.872] cl: http://emprear.dnsd.info/varios7/x.html @ http://emprear.dnsd.info/varios7/TheIframe.html:14
[13:49:47.874] cl: [object XrayWrapper [object HTMLDocument]] @ http://emprear.dnsd.info/varios7/TheIframe.html:15
[13:49:47.896] El uso de enablePrivilege está desaprobado. Por favor, use en su lugar código que se ejecute con el principal del sistema (p.e. una extensión). @ http://emprear.dnsd.info/varios7/TheIframe.html
[13:49:47.903] A un script de "http://emprear.dnsd.info" se le han denegado los privilegios UniversalXPConnect. @ http://emprear.dnsd.info/varios7/TheIframe.html:17

Me gustaría ver un ejemplo completo del uso de tu código funcionando

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #13 (permalink)  
Antiguo 11/05/2012, 11:40
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

A si olvide mencionar que debes marcar como true a la propiedad "signed.applets.codebase_principal_support" que se encuentra, escribiendo en la barra de direcciones, "about:config", todo esto para firefox. Es por eso que no te dejaba habilitar el privilegio para leer el iframe, ya veras que maravilla es eso :)

Última edición por IXtremeLT; 11/05/2012 a las 12:39
  #14 (permalink)  
Antiguo 11/05/2012, 12:46
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Eso carece de toda universalidad, solo te funciona en tu firefox, necesita de un cambio de configuración por parte del usuario, con el agravante de


he incluso, después de haber hecho el cambio, para una url remota obtenés
[15:39:55.210] Permission denied to access property 'toString' @ http://emprear.dnsd.info/varios7/TheIframe.html:14

No é como podés obtener un dato fiable sobre el punto
¿Cómo saber si una url "ajena" devuelve 404?
Que es lo que nos interesa

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #15 (permalink)  
Antiguo 11/05/2012, 15:16
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

@emprear fijate algo hiciste mal por que checa este log de la consola web:

Código Javascript:
Ver original
  1. [15:46:55.353] document.domain
  2. [15:46:55.359] "angelfcm.my-place.us"
  3. --
  4. [15:47:29.629] $('iframe[name=frame1]').attr('src');
  5. [15:47:29.637] "http://forosdelweb.com"
  6. --
  7. [15:48:16.513] frame1.location.toString(); // Sin UniversalXPConnect
  8. [15:48:16.521] Error: Permission denied to access property 'toString'
  9. --
  10. [15:48:55.463] netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); frame1.location.toString(); // Con UniversalXPConnect
  11. [15:48:58.223] "http://www.forosdelweb.com/"
  12. --
  13. [15:49:31.134] netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); frame1.document.title; // Con UniversalXPConnect
  14. [15:49:33.790] "Foros del Web, comunidad para aprender web"

En mi ocasión es totalmente útil, y estoy muy agradecido que si hay una forma aunque se limite a firefox y que el usuario tenga que aceptar la desición. Además si le das en recordar desición, ya no te aparecerá ese mensaje.

Quería optar por usar PHP, pero al usar get_headers(), no puedes estar seguro cuales fueron las cabezeras finales, ya que si el sitio te redirige a otro lugar, get_headers() no te da esas cabezeras, te da las del primer enlace. De hecho estuve investigando, y vi que hay formas de obtener las cabezeras de varias redirecciones, pero es muy lento el funcionamiento y en algunas páginas núnca termina de buscar (se traba). Además cuando la URL tiene consultas GET, es raro que el sitio te de un 404, simplemente te muestra un error, de usuario final, de que la página o articulo no existe.

Mucho menos funcionaría con un simple fopen, ya que al no existir el enlace, te redirecciona al hosting, así que siempre habrá un "true" a menos que el sitio no tenga hosting, que es muy raro.

Y si uso los iframes, puedo obtener el enlace final al cargar el sitio y asi compararlo con el enlace que se solicitó, si es diferente, lo más posible es que no se encontró el enlace en el sitio (404). Para asegurarlo voy a establecer patrones para distintos sitios con los que funciona el sistema web que la aplicación tiene que depurar, no son muchos (como 5). Los patrones serían por ejemplo, el mensaje de error que da el sitio al no encontrar el enlace, o bien la url que devuelve. Para ello tengo que acceder al DOM y con este privilegio es posible hacerlo.

Si tu sabes una mejor manera de hacerlo, dimela. Saludos!
  #16 (permalink)  
Antiguo 11/05/2012, 16:31
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 17 años, 5 meses
Puntos: 1567
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Si decís que ese sistema te funciona, perfecto, usalo, solo te aclaro que si fopen() no encuentra la url, devuelve false, más alla de que alguna directiva del server te rediriga a otra parte con un status 404, si querés evita los 301, etc, haces

Código PHP:
Ver original
  1. <?php
  2. $url = 'http://foros.emprear.com/html/word-wrap-en-celdas/word-wrap-en-celdas.html';
  3. $opts = array(
  4.        'http' => array('method' => 'GET',
  5.                        'max_redirects' => '1') // 1 ó menor evita cualquier redirección
  6.        );
  7. $context = stream_context_create($opts);
  8. $stream = fopen($url, 'r', false, $context);
  9.  if($stream !== false){
  10.  echo "existe";
  11.  }else{
  12.  echo "no existe";
  13.  }
  14. fclose($stream);
  15. ?>

Te pongo ejemplos concretos
En mi .htaccess tengo
Código Apache:
Ver original
  1. Redirect 301 /html/word-wrap-en-celdas/word-wrap-en-celdas.html http://foros.emprear.com/css/word-wrap-en-celdas-css/

Es decir
http://foros.emprear.com/html/word-w...en-celdas.html
NO existe, el htaccess redirije al otro.
Proba la script incrementando el valor 1 a 2, ahi si te va a decir que existe porque hizo la redirección. mientras esté en 1, fopen retorna false

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #17 (permalink)  
Antiguo 11/05/2012, 16:59
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: ¿Cómo saber si una url "ajena" devuelve 404?

Ha, eso me parece muy fiable :), mas que el get_headers(), entonces si hay redireccion te da false. Solo que ya lo pense bien y es preferible que use el DOM por que muchos de los enlaces usan consultas GET y si no existe el item simplemente muestra un mensaje de error visual y sigue siendo status 200.
Pero voy a tomar en cuenta tu script para cuando lo necesite, gracias!

Etiquetas: ajax-cross, ajaxerror, dominio-ajeno, iframe, readystate-4, status-0, url-ajena, window.open
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 02:09.