【问题标题】:Javascript redirect on 404 errorJavascript重定向404错误
【发布时间】:2017-01-24 19:47:06
【问题描述】:

有一个包含一年中每一天的 html 文档的外部网站,我正在尝试自动加载当前日期的文档。但是,每个文档的 url 并不一致。其中一些以.html 结尾,而另一些以.htm 结尾,其中一些可能会在文件名后附加一个字母。

我想要做的是尝试加载一个 url,如果它导致 404 错误,请尝试加载不同的 url。

例如,我可能会做window.location.replace(baseurl+'.htm'); 如果导致 404 错误,请尝试 window.location.replace(baseurl+'.html');,如果导致 404,请尝试其他操作。

如何确定服务器何时发送 404 错误并尝试加载新 url?

【问题讨论】:

  • 您可以在实际重定向之前尝试使用 XHR。重定向后,您的代码将停止运行,您将无能为力。

标签: javascript


【解决方案1】:

这是一个函数,您可以在其中传递扩展来尝试,它会将第一个有效的 URL 返回给回调:

var request = new XMLHttpRequest();
var extensions = ['.html', '.htm'];
var count = 0;
var baseurl = 'http://blah.com/file';

function validUrl(baseurl, cb) {
  request.open('GET', baseurl + extensions[count], true);

  request.onreadystatechange = function() {
    if (request.readyState === 4) {
      if (request.status === 200) {
        cb(baseurl + extensions[count]);
      } else {
        count++;
        if (count === extensions.length) {
          cb(false);
        } else {
          validUrl(baseurl, cb);
        }
      }
    }
  };

  request.send();
}

// usage:

validUrl(baseurl, function(url) {
  if (url) {
    // use the valid url
  } else {
    console.log('no valid urls');
  }
});

【讨论】:

  • 看起来这样可以完美运行,但是我尝试读取的服务器阻止了跨域请求,所以我必须找出其他我想的东西。
  • 如果它们不在同一个域中,则必须使用 JSONP,让服务器设置 Access-Control-Allow-Origin 标头,或使用 some other method
【解决方案2】:

正如@Siguza 所说,您可以将其作为异步请求持续存在并验证其状态。

我建议您创建一个调用 AJAX 的函数并将其状态返回给您,如果它可以或不作为布尔值。比如:

// I'm  building an function to validate the URL
function checkValidURL(url) {
  var xmlhttp;
  if (window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
  } else {
    // code for older browsers
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }

  // Callback
  xmlhttp.onreadystatechange = function() {
    if (this.status == 200) {
      return true; // OK
    } else { // or -> } else if (this.status == 404) {
      return false; // Ops, something happen..
    }
  };
  // AJAX configuration
  xmlhttp.open("GET", url, false); // <- "false" for a synchronous request
  xmlhttp.send();
}

简单使用示例:

if (!checkValidURL("http://www.my_url")) {
    console.log("invalid URL"); 

    // Call or check other URL
} else {
    // It's OK, proceed with the business rules
}

函数可以通过设置异步“false”来等待AJAX​​请求,例如:Is there any way to wait for AJAX response and halt execution?

【讨论】:

  • 这行不通,因为函数会在 AJAX 解析之前返回。
  • 更新了,我的错误同步是真的。
  • 谢谢,看起来代码不错,但是我收到 Cross-Origin Request Blocked 错误,所以我可能需要在这里重新考虑我的方法。
  • 您的函数仍然在xmlhttp.send() 之前返回。
  • 不客气@Zarxrax,我建议你看看有关CORS + xmlHttpRequest的问题,例如:stackoverflow.com/questions/23272611/…stackoverflow.com/questions/13400594/… ..希望它可以帮助你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2013-05-05
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多