从URL获取协议,域和端口

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

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

首先得到当前的地址

 var url = window.location.href 

然后parsing这个string

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

你的url是:

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

希望这可以帮助

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

这些答案似乎都没有完全解决这个问题,这需要一个任意的url,不是特别的当前页面。

利用浏览器的内置parsing器

如果你想分解任何给定的url,你可以利用DOM方法:

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

而已!

浏览器的内置parsing器已经完成了它的工作。 现在你可以抓住你需要的零件:

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

奖金

因为'?startIndex = 1&pageSize = 10'本身不太可用,所以你可能会想要分割searchurl params。

这有两个function,将照顾到这一点:

 /** * Break apart any path into parts * 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10' -> * { * "host": "example.com", * "port": "12345", * "search": { * "startIndex": "1", * "pageSize": "10" * }, * "path": "/blog/foo/bar", * "protocol": "http:" * } */ function getPathInfo(path) { // create a link in the DOM and set its href var link = document.createElement('a'); link.setAttribute('href', path); // return an easy-to-use object that breaks apart the path return { host: link.hostname, // 'example.com' port: link.port, // 12345 search: processSearchParams(link.search), // {startIndex: 1, pageSize: 10} path: link.pathname, // '/blog/foo/bar' protocol: link.protocol // 'http:' } } /** * Convert search param string into an object or array * '?startIndex=1&pageSize=10' -> {startIndex: 1, pageSize: 10} */ function processSearchParams(search, preserveDuplicates) { // option to preserve duplicate keys (eg 'sort=name&sort=age') preserveDuplicates = preserveDuplicates || false; // disabled by default var outputNoDupes = {}; var outputWithDupes = []; // optional output array to preserve duplicate keys // sanity check if(!search) throw new Error('processSearchParams: expecting "search" input parameter'); // remove ? separator (?foo=1&bar=2 -> 'foo=1&bar=2') search = search.split('?')[1]; // split apart keys into an array ('foo=1&bar=2' -> ['foo=1', 'bar=2']) search = search.split('&'); // separate keys from values (['foo=1', 'bar=2'] -> [{foo:1}, {bar:2}]) // also construct simplified outputObj outputWithDupes = search.map(function(keyval){ var out = {}; keyval = keyval.split('='); out[keyval[0]] = keyval[1]; outputNoDupes[keyval[0]] = keyval[1]; // might as well do the no-dupe work too while we're in the loop return out; }); return (preserveDuplicates) ? outputWithDupes : outputNoDupes; } 

出于某种原因,所有的答案都是过度的。 这是所需要的:

 window.location.origin 

更多细节可以在这里find: https : //developer.mozilla.org/en-US/docs/Web/API/window.location#Properties

正如已经提到的那样,目前还没有完全支持window.location.origin ,而不是使用它或者创build一个新的variables来使用,我更喜欢检查它,如果它没有设置它。

例如;

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

我其实写了几个月后这个修复window.location.origin

主办

 var url = window.location.host; 

返回localhost:2679

主机名

 var url = window.location.hostname; 

返回localhost

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

这意味着如果你只想得到HTTP / HTTPS部分,你可以这样做:

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

对于您可以使用的域名:

 var domain = window.location.hostname; 

对于您可以使用的端口:

 var port = window.location.port; 

请记住,如果端口在URL中不可见,则它将是一个空string。 例如:

如果您没有端口使用时需要显示80/443

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

事实上, 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: ''); 
 var http = location.protocol; var slashes = http.concat("//"); var host = slashes.concat(window.location.hostname); 
 var getBasePath = function(url) { var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i); return r ? r[0] : ''; }; 

尝试使用正则expression式(正则expression式),这将是非常有用的,当你想validation/提取的东西,甚至做一些简单的JavaScriptparsing。

正则expression式是:

 /([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] 

现在你可以做validation了。

大卫的答案是伟大的,非常全面的,但不会与服务器端的JavaScript,因为document.createElement调用(文档不会被定义)。

我写了一个简单的组件 ,覆盖了服务器上或浏览器中的任意URL,并将它们parsing成一个对象。 您可以按如下方式使用parseUrl()来获取没有path或查询string的基础url和端口:

 var url = 'https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer'; var urlObject = parseUrl(url); var newUrl = urlObject.protocol + '//' + urlObject.host; 

像David的方法一样,这也提供了url对象中的所有url部分。

 urlObject.href // 'https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer' urlObject.searchParams // { lang: 'it', report_type: 'consumer' } urlObject.hash // '' urlObject.search // '?lang=it&report_type=consumer' urlObject.protocol // 'https:' urlObject.host // 'localhost:8181' urlObject.hostname // 'localhost' urlObject.path // '/ContactUs-1.0/contact' 

随意导入组件以使用parseUrl方法。