【问题标题】:Check if cross domain url gives 404 with javascript检查跨域 url 是否使用 javascript 给出 404
【发布时间】:2013-07-19 15:19:00
【问题描述】:

我正在尝试这段代码,但它给了我一个 DOM 异常。我希望它使用纯 Javascript 从函数中获得真/假“答案”。

var url = 'http://www.google.com/';
function UrlExists(url)
{
  var http = new XMLHttpRequest();
  http.open('HEAD', url, false);
  http.send();
  return http.status!=404;
}
UrlExists(url);

FIDDLE

我从 this 那里得到了这个代码所以回答,但正如我所说的我无法让它工作......

【问题讨论】:

  • 此方法不适用于同源策略。您必须使用服务器端组件来检查 URL 是否存在。一种选择是在此答案中使用 YQL:stackoverflow.com/a/13041787/133198
  • @vsr,谢谢你的想法。有没有客户端方法可以做到这一点?
  • 客户端只有在url的主机支持CORS(html5rocks.com/en/tutorials/cors)时才可能。由于许多网站不支持 CORS,因此客户端解决方案并非万无一失。
  • 破解 SOP 的唯一方法是以浏览器认为更安全的方式加载页面,方法是使用带有另一个元素的 hack。我建议尝试使用onerror 处理程序来处理imgobject 标记,看看您是否可以检索状态码。过去我曾类似地滥用过iframes,但那里有一些限制(我已经有效地使用它来处理 fire and forget 调用,或者当 iframe 源显式回调父级时)。

标签: javascript xml ajax


【解决方案1】:

跨域不提供任何状态码。状态码是服务器响应是或否时从服务器接收到的内容的一部分。在跨域服务器的情况下永远不会响应请求。

代码中的第二个错误是您无法在没有任何等待时间或成功事件的情况下直接捕获状态代码。函数中的return语句不会等到服务器响应ajax请求,所以你不能依赖它。

【讨论】:

  • http.open 有async 参数,当它设置为false 时,send() 直到响应结束才会返回。但不建议在主线程中执行。
【解决方案2】:

由于 JavaScript 中的“同源策略”,您不能从不同的 URL 调用服务。这里提供了一些解决方法:

Ways to circumvent the same-origin policy

最简单的方法是使用“iframe”。通过使用您的目标网址打开 iframe,您将能够向该网址发出 http 请求。

【讨论】:

    【解决方案3】:

    我看到了你的小提琴,它包含两个问题:

    1. DOM 异常
    2. CORS 政策
    • 您收到 DOM 异常,因为您正在进行同步调用。

    通过将 last 属性设置为 true 使调用同步

    http.open('GET', url, true);

    你可以在这里阅读文档XMLHttpRequest Parameters

    也可以看看这个:DOM Exception-failed-to-execute-send-on-xmlhttprequest-on-chrome-only

    • 您可以了解有关 cors 问题here

    【讨论】:

      【解决方案4】:

      不检测 404 错误,但可以使用 setTimeout() hack 来检查页面是否存在。

      // Based on https://stackoverflow.com/a/18552771
      // @author Irvin Dominin <https://stackoverflow.com/u/975520>
      function UrlExists(url)
      {
        var iframe = document.createElement('iframe');
        var iframeError; // Store the iframe timeout
        
        iframe.onload = function () {
          console.log("Success on " + url);
          clearTimeout(iframeError);
        }
        
        iframeError = setTimeout(function () {
          console.log("Error on " + url)
        }, 3000);
        
        iframe.src = url;
        document.getElementsByTagName("body")[0].appendChild(iframe);
      }
      
      UrlExists('http://www.google.com/');
      UrlExists('http://www.goo000gle.com');

      【讨论】:

        猜你喜欢
        • 2015-11-03
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 2021-08-03
        • 2014-06-17
        • 2013-11-20
        相关资源
        最近更新 更多