从URL获取协议,域和端口


301

我需要从给定的URL中提取完整的协议,域和端口。例如:

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181

9
对于那些正在寻找URL不在当前位置的答案的读者,请在接受的答案下方查看
Guy Schalnat 2015年

Answers:


150

首先获取当前地址

var url = window.location.href

然后只需解析该字符串

var arr = url.split("/");

您的网址是:

var result = arr[0] + "//" + arr[2]

希望这可以帮助


8
这适用于location对象不可用的URL字符串(浏览器外部的js!)
Thamme Gowda 2014年

David Calhoun的答案使用了内置的解析器(如location),但可以用于任何 URL。检查一下,它很整洁。
Stijn de Witt

6
或者只是将其变成window.location.href.split('/').slice(0, 3).join('/')
单线

以及如何在节点上执行此操作?
DDD

5
window.location.origin
int soumen

576
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');

3
@Randomblue怎么样?你会得到about://。但是,我很好奇,用例将是什么about:blank?我不确定是否有任何浏览器在中注入插件资源about:blank,但似乎可能是唯一的用例。
架子

3
如果您有URL字符串,这根本不起作用,对吗?(即,您需要 location此工作)
Nick T

1
对不起,我的回复@NickT。是的,它不会那样做。请使用David提供出色解决方案
货架

1
该答案应选择为正确答案。很干净,并使用标准的位置对象。
Mohit Gangrade

14
您不能使用+ location.host代替吗?location.hostnamelocation.port
c24w

180

这些答案似乎都无法完全解决这个问题,该问题要求使用任意网址,而不是当前页面的网址。

方法1:使用URL API(警告:不支持IE11)

您可以使用URL API(IE11不支持,但在其他任何地方都)。

这也使得访问搜索参数变得容易。另一个好处是:由于它不依赖DOM,因此可以在Web Worker中使用。

const url = new URL('http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

方法2(旧方法):在DOM中使用浏览器的内置解析器

如果您还需要在旧版浏览器上使用此功能,请使用此功能。

//  Create an anchor element (note: no need to append this element to the document)
const url = document.createElement('a');
//  Set href to any path
url.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

而已!

浏览器的内置解析器已经完成了工作。现在,您只需获取所需的零件即可(请注意,这对以上两种方法都适用):

//  Get any piece of the url you're interested in
url.hostname;  //  'example.com'
url.port;      //  12345
url.search;    //  '?startIndex=1&pageSize=10'
url.pathname;  //  '/blog/foo/bar'
url.protocol;  //  'http:'

奖励:搜索参数

您可能还需要分解搜索网址参数,因为'?startIndex = 1&pageSize = 10'本身不太有用。

如果您使用上面的方法1(URL API),则只需使用searchParams getter:

url.searchParams.get('startIndex');  // '1'

或获取所有参数:

function searchParamsToObj(searchParams) {
  const paramsMap = Array
    .from(url.searchParams)
    .reduce((params, [key, val]) => params.set(key, val), new Map());
  return Object.fromEntries(paramsMap);
}
searchParamsToObj(url.searchParams);
// -> { startIndex: '1', pageSize: '10' }

如果使用方法2(旧方法),则可以使用以下方法:

// Simple object output (note: does NOT preserve duplicate keys).
var params = url.search.substr(1); // remove '?' prefix
params
    .split('&')
    .reduce((accum, keyval) => {
        const [key, val] = keyval.split('=');
        accum[key] = val;
        return accum;
    }, {});
// -> { startIndex: '1', pageSize: '10' }

如果我通过“ google.com”检查anker,link.protocol会给我一个“ http:” :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe

您是否正在http页面上这样做?如果未指定,它将从当前位置“继承”
Stijn de Witt

4
这是一个很棒的答案,应该会获得更多的选票,因为这个答案不仅限于当前位置,还可以用于任何url,并且因为这个答案利用了浏览器的内置解析器,而不是自己构建(我们不能希望做得好或快!)。
Stijn de Witt

谢谢您的巧妙技巧!我想补充一件事:同时存在hosthostname。前者包括端口(例如localhost:3000),而后者只是主机名(例如localhost)。
编码人员

在绝对URL的情况下,此方法效果很好。如果是相对URL和跨浏览器,它将失败。有什么建议么?
Gururaj

132

出于某种原因,所有答案都不过分。这就是所有步骤:

window.location.origin

可以在这里找到更多详细信息:https : //developer.mozilla.org/en-US/docs/Web/API/window.location#Properties


19
仅供参考,我相信所有流行的浏览器都将在将来实现该功能,但是目前情况并非如此:developer.mozilla.org/en-US/docs/Web/API/…在根据我的研究,在撰写本文时,仅Firefox和WebKit浏览器的最新版本支持origin属性。
Zac Seth

2
只需完成一下:位置是在HTML5定义的,它实现了在WHATWGURLUtils定义并包含origin属性的接口。
Ciro Santilli郝海东冠状病六四事件法轮功

5
您好,从2015年开始。.很遗憾,根据MDN上的此兼容性表,URLUtils仍未在所有浏览器中正确实现。但是,似乎与2013年相比,对origin属性的支持要好一些,因为它在Safari中未正确实现,因此仍不适合生产。抱歉:(
–notlyLizards,2015年

更新:许多浏览器(以及野生动物园)仍不支持:( :(
Ahmad hamza

它在IE中也不起作用,它返回“ undefined”。
Siddhartha Chowdhury

53

正如已经提到的那样,目前还没有完全支持window.location.origin它,但是我宁愿检查它以及是否未设置它来代替使用它或创建要使用的新变量。

例如;

if (!window.location.origin) {
  window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}

几个月前,我实际上写了有关此内容的信息。window.location.origin的修复


1
我知道这是第一次window.location.origin存在。谢谢。^^
EThaizone


23

window.location.origin 将足以获得相同的效果。


1
轻松解决了我的问题。谢谢@intsoumen
Turker Tunali

14

protocol属性设置或返回当前URL的协议,包括冒号(:)。

这意味着,如果您只想获取HTTP / HTTPS部分,则可以执行以下操作:

var protocol = window.location.protocol.replace(/:/g,'')

对于域,您可以使用:

var domain = window.location.hostname;

对于端口,您可以使用:

var port = window.location.port;

请记住,如果URL在URL中不可见,则该端口将为空字符串。例如:

如果在不使用端口时需要显示80/443

var port = window.location.port || (protocol === 'https' ? '443' : '80');

9

为什么不使用:

let full = window.location.origin

3
在将现有问题添加到较旧问题的答案时,解释您的答案会带来什么新信息以及确认时间的流逝是否会影响答案非常有用。
詹森·艾勒

8

确实,window.location.origin在遵循标准的浏览器中可以正常工作,但请猜测是什么。IE没有遵循标准。

因此,这就是在IE,FireFox和Chrome中对我有效的方法:

var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');

但是对于将来可能引起冲突的增强功能,我在“位置”对象之前指定了“窗口”引用。

var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');

6

这是我正在使用的解决方案:

const result = `${ window.location.protocol }//${ window.location.host }`;

编辑:

要增加跨浏览器的兼容性,请使用以下命令:

const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;

1
已推荐,但window.location.host可能不是最好的跨浏览器
Nathanfranke

1
谢谢,我已经将跨浏览器的兼容性添加到了原始答案中。
JulienRioux

3
var http = location.protocol;
var slashes = http.concat("//");
var host = slashes.concat(window.location.hostname);

3
var getBasePath = function(url) {
    var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
    return r ? r[0] : '';
};

2
考虑解释您的答案。不要以为OP可以理解代码不同部分的重要性。
ADyson

3

尝试使用正则表达式(Regex),当您要验证/提取内容或什至在javascript中进行一些简单的解析时,这将非常有用。

正则表达式为:

/([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/

示范:

function breakURL(url){

     matches = /([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/.exec(url);

     foo = new Array();

     if(matches){
          for( i = 1; i < matches.length ; i++){ foo.push(matches[i]); }
     }

     return foo
}

url = "https://www.google.co.uk:55699/search?q=http%3A%2F%2F&oq=http%3A%2F%2F&aqs=chrome..69i57j69i60l3j69i65l2.2342j0j4&sourceid=chrome&ie=UTF-8"


breakURL(url);       // [https, www.google.co.uk, 55699] 
breakURL();          // []
breakURL("asf");     // []
breakURL("asd://");  // []
breakURL("asd://a"); // [asd, a, undefined]

现在您也可以进行验证。


“有效的RFC 3986 URL方案必须包含“字母,后跟字母,数字,加号(“ +”),句点(“。”)或连字符(“-”)的任意组合。”- stackoverflow。 com / a / 9142331/188833(以下是该方案的urn:ietf:rfc:3897(URI)/ urn:ietf:rfc:3897(IRI)正则表达式:Python中URI / IRI的一部分:github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147
韦斯特纳

2

适用于所有浏览器的简单答案:

let origin;

if (!window.location.origin) {
  origin = window.location.protocol + "//" + window.location.hostname + 
     (window.location.port ? ':' + window.location.port: '');
}

origin = window.location.origin;

1

具有可配置参数的ES6样式。

/**
 * Get the current URL from `window` context object.
 * Will return the fully qualified URL if neccessary:
 *   getCurrentBaseURL(true, false) // `http://localhost/` - `https://localhost:3000/`
 *   getCurrentBaseURL(true, true) // `http://www.example.com` - `https://www.example.com:8080`
 *   getCurrentBaseURL(false, true) // `www.example.com` - `localhost:3000`
 *
 * @param {boolean} [includeProtocol=true]
 * @param {boolean} [removeTrailingSlash=false]
 * @returns {string} The current base URL.
 */
export const getCurrentBaseURL = (includeProtocol = true, removeTrailingSlash = false) => {
  if (!window || !window.location || !window.location.hostname || !window.location.protocol) {
    console.error(
      `The getCurrentBaseURL function must be called from a context in which window object exists. Yet, window is ${window}`,
      [window, window.location, window.location.hostname, window.location.protocol],
    )
    throw new TypeError('Whole or part of window is not defined.')
  }

  const URL = `${includeProtocol ? `${window.location.protocol}//` : ''}${window.location.hostname}${
    window.location.port ? `:${window.location.port}` : ''
  }${removeTrailingSlash ? '' : '/'}`

  // console.log(`The URL is ${URL}`)

  return URL
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.