根据base.href或location生成规范/真实URL

时间:2010-05-14 17:21:07

标签: javascript jquery url canonical-link

是否有方法/函数来获取规范/转换的URL,尊重页面的任何base.href设置?

我可以使用$("base").attr("href")通过(在jQuery中)获取基本URL,我可以使用字符串方法来解析与此相关的URL,但是

  • $(“base”)。attr(“href”)没有主机,路径等属性(比如window.location)
  • 手动将它们放在一起相当繁琐

例如,给定"http://example.com/foo/"的base.href和相对网址"/bar.js",结果应为:"http://example.com/bar.js"

如果base.href不存在,则应该相对于window.location创建URL。 这应该处理不存在的base.href(在这种情况下使用location作为基础)。

是否有可用的标准方法?

(我正在寻找这个,因为当使用像“/foo.js”这样的相对URL时jQuery.getScript失败并且正在使用BASE标记(FF3.6发出OPTIONS请求,而nginx无法处理这个)。使用完整的URL(base.href.host +“/ foo.js”时,它可以工作)。)

2 个答案:

答案 0 :(得分:2)

这可以解决这个问题吗?

function resolveUrl(url){
    if (!url) {
        throw new Error("url is undefined or empty");
    }
    var reParent = /[\-\w]+\/\.\.\//, // matches a foo/../ expression 
 reDoubleSlash = /([^:])\/\//g; // matches // anywhere but in the protocol
    // replace all // except the one in proto with /
    url = url.replace(reDoubleSlash, "$1/");
    var base = (document.getElementsByTagName('BASE')[0] && document.getElementsByTagName('BASE')[0].href) || "";

    // If the url is a valid url we do nothing
    if (!url.match(/^(http||https):\/\//)) {
        // If this is a relative path
        var path = (url.substring(0, 1) === "/") ? base : location.pathname;
        if (path.substring(path.length - 1) !== "/") {
            path = path.substring(0, path.lastIndexOf("/") + 1);
        }
        if (!url.match(/^(http||https):\/\//)) {
            url = location.protocol + "//" + location.host + path + url;
        }
    }

    // reduce all 'xyz/../' to just '' 
    while (reParent.test(url)) {
        url = url.replace(reParent, "");
    }
    return url;
}

它是根据我的一些代码修改的,所以它还没有经过测试

答案 1 :(得分:0)

js-uri是一个有用的javascript库来完成此任务:http://code.google.com/p/js-uri/

您仍然需要处理base.href vs window.location部分,但其余部分可以通过库来完成。