Cách trích xuất phần tên máy chủ của URL trong JavaScript


379

Có cách nào thực sự dễ dàng để bắt đầu từ một URL đầy đủ không:

document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah"

Và chỉ trích phần lưu trữ:

aaa.bbb.ccc.com

Phải có một hàm JavaScript thực hiện điều này một cách đáng tin cậy, nhưng tôi không thể tìm thấy nó.

Câu trả lời:


827

giả sử bạn có một trang có địa chỉ này : http://sub.domain.com/virtualPath/page.htm. sử dụng như sau trong mã trang để đạt được những kết quả đó:

  • window.location.host: bạn sẽ nhận được sub.domain.com:8080hoặcsub.domain.com:80
  • window.location.hostname : bạn sẽ nhận được sub.domain.com
  • window.location.protocol : bạn sẽ nhận được http:
  • window.location.port: bạn sẽ nhận được 8080hoặc80
  • window.location.pathname : bạn sẽ nhận được /virtualPath
  • window.location.origin: bạn sẽ nhận được http://sub.domain.com*****

Cập nhật: về .origin

***** Như các trạng thái ref , khả năng tương thích trình duyệt window.location.originkhông rõ ràng. Tôi đã kiểm tra nó bằng chrome và nó trả về http://sub.domain.com:portnếu cổng là bất cứ thứ gì ngoài 80 và http://sub.domain.comnếu cổng là 80.

Đặc biệt cảm ơn @torazaburo đã đề cập đến tôi.


Tôi có một trang web và 2 ứng dụng trong IIS. Ví dụ: sub.domain.com/v1sub.domain.com/v2 và các trang như sub.domain.com/v1/Default.aspx hoặc sub.domain.com/v2/ Products /Default.aspx , v.v. có thể lấy value / v2 , root cho ứng dụng của tôi sub.domain.com/v2 không?
Kiquenet

@Kiquenet sử dụng IDE javascript như WebStorm, bạn có thể thấy các tùy chọn có thể khi bạn viết mã.
Bhargav Nanekalva

3
window.location.originkhông được xác định trong IE9 (theo liên kết, đó là IE11 +). Câu trả lời này đã giúp.
Neolisk

1
Rõ ràng là hữu ích cho hầu hết mọi người ngoại trừ nó không trả lời câu hỏi đó là làm thế nào để trích xuất phần máy chủ ra khỏi URL. Hài hước câu trả lời đúng với chức năng getRootUrl chỉ có 17 so với 609 phiếu.
Miro

@Miro câu hỏi được trả lời phải không, gạch đầu dòng thứ 2 trả lời câu hỏi: window.location.hostname: bạn sẽ nhận được sub.domain.com
Paul

155

Bạn có thể nối giao thức vị trí và máy chủ lưu trữ:

var root = location.protocol + '//' + location.host;

Đối với một url, giả sử 'http://stackoverflow.com/questions', nó sẽ trở lại'http://stackoverflow.com'


5
có vẻ như bạn nên sử dụng "tên máy chủ" thay vì "máy chủ" để đạt được kết quả trên. nguồn: stackoverflow.com/questions/6725890/
Mạnh

Bạn có thể sử dụng location.origin với cùng kết quả.
Sérgio

1
Câu hỏi ban đầu không yêu cầu phần giao thức của URL.
Simon East

36

Sử dụng document.locationđối tượng và nó hosthoặc hostnametài sản.

alert(document.location.hostname); // alerts "stackoverflow.com"

29

Câu trả lời được chấp nhận không hoạt động đối với tôi vì muốn có thể làm việc với bất kỳ url tùy ý nào, không chỉ URL trang hiện tại.

Hãy nhìn vào URLđối tượng :

var url = new URL("http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah");
url.protocol;  // "http:"
url.hostname;  // "aaa.bbb.ccc.com"
url.pathname;  // "/asdf/asdf/sadf.aspx"
url.search;    // "?blah"

1
Cảm ơn bạn. Trong nhiều giờ, tôi đã tìm kiếm phương pháp để trích xuất url mà tôi nhận được từ api. Nó thật đơn giản. Tôi chỉ đọc nó trong url với URL mới. Cảm ơn bạn.
Nodirabegimxonoyim

1
+99999999999999
ADJenks

Một trong hai câu trả lời ở đây không cho rằng bạn đang ở phía trình duyệt của mọi thứ ...
Will59

không hoạt động trên IE11 :(
Teoman shipahi

24

Có hai cách. Đầu tiên là một biến thể của một câu trả lời khác ở đây, nhưng câu hỏi này chiếm các cổng không mặc định:

function getRootUrl() {
  var defaultPorts = {"http:":80,"https:":443};

  return window.location.protocol + "//" + window.location.hostname
   + (((window.location.port)
    && (window.location.port != defaultPorts[window.location.protocol]))
    ? (":"+window.location.port) : "");
}

Nhưng tôi thích phương thức đơn giản hơn này (hoạt động với bất kỳ chuỗi URI nào):

function getRootUrl(url) {
  return url.toString().replace(/^(.*\/\/[^\/?#]*).*$/,"$1");
}

3
Cảm ơn bạn! Tôi thích phương pháp thứ 2 tốt hơn quá! đặc biệt là khi trên javascript phía máy chủ, không có cách nào để có được window.location :)
nghìn tỷ

Một trong hai câu trả lời ở đây không cho rằng bạn đang ở phía trình duyệt của mọi thứ ... Nhưng hãy kiểm tra câu trả lời gần đây hơn từ Martin Konecny ​​bằng URL mới.
Will59



3

Có một cách hack khác mà tôi sử dụng và chưa từng thấy trong bất kỳ phản hồi StackOverflow nào: sử dụng thuộc tính "src" của hình ảnh sẽ mang lại đường dẫn cơ sở hoàn chỉnh cho trang web của bạn. Ví dụ :

var dummy = new Image;
dummy.src = '$';                  // using '' will fail on some browsers
var root = dummy.src.slice(0,-1); // remove trailing '$'

Trên một URL như http://domain.com/somesite/index.html, rootsẽ được đặt thành http://domain.com/somesite/. Điều này cũng hoạt động cho localhost hoặc bất kỳ URL cơ sở hợp lệ.

Lưu ý rằng điều này sẽ gây ra yêu cầu HTTP thất bại trên $hình ảnh giả. Bạn có thể sử dụng một hình ảnh hiện có để thay thế, chỉ với những thay đổi mã nhỏ.

Một biến thể khác sử dụng liên kết giả, không có tác dụng phụ đối với các yêu cầu HTTP:

var dummy = document.createElement ('a');
dummy.href = '';
var root = dummy.href;

Tôi đã không kiểm tra nó trên mọi trình duyệt, mặc dù.


3

Kiểm tra điều này:

alert(window.location.hostname);

cái này sẽ trả về tên máy chủ www.domain.com

và:

window.location.host

sẽ trả lại tên miền với cổng như www.example.com:80

Để tham khảo đầy đủ, hãy kiểm tra trang web của nhà phát triển Mozilla .


2

Tôi muốn chỉ định một cái gì đó. Nếu ai đó muốn lấy toàn bộ url với đường dẫn như tôi cần, có thể sử dụng:

var fullUrl = window.location.protocol + "//" + window.location.hostname + window.location.pathname;

Tại sao đi đường dài hơn. Nó có thể nhận được với var fullUrl = window.location.origin + window.location.pathname
Anant

nhưng đôi khi bạn muốn thêm một cái gì đó như tên miền phụ giữa giao thức và tên máy chủ, ví dụ như đa ngôn ngữ, v.v.
crx4

2

Tôi biết điều này hơi muộn, nhưng tôi đã thực hiện một chức năng nhỏ gọn với một cú pháp ES6 nhỏ

function getHost(href){
  return Object.assign(document.createElement('a'), { href }).host;
}

Nó cũng có thể được viết trong ES5 như

function getHost(href){
  return Object.assign(document.createElement('a'), { href: href }).host;
}

Tất nhiên IE không hỗ trợ Object.assign, nhưng trong công việc của tôi, điều đó không thành vấn đề.


1

Regex cung cấp sự linh hoạt hơn nhiều.

    //document.location.href = "http://aaa.bbb.ccc.com/asdf/asdf/sadf.aspx?blah
    //1.
     var r = new RegExp(/http:\/\/[^/]+/);
     var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com

    //2. 
     var r = new RegExp(/http:\/\/[^/]+\/[^/]+/);
     var match = r.exec(document.location.href) //gives http://aaa.bbb.ccc.com/asdf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.