วิธีแยกส่วนชื่อโฮสต์ของ URL ใน JavaScript


379

มีวิธีง่าย ๆ ในการเริ่มต้นจาก URL แบบเต็ม:

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

และแยกเฉพาะส่วนโฮสต์:

aaa.bbb.ccc.com

ต้องมีฟังก์ชั่น JavaScript ที่ทำงานได้อย่างน่าเชื่อถือ แต่ฉันไม่พบมัน

คำตอบ:


826

http://sub.domain.com/virtualPath/page.htmสมมติว่าคุณมีหน้าเว็บที่มีอยู่นี้: ใช้โค้ดในหน้าต่อไปนี้เพื่อให้ได้ผลลัพธ์เหล่านั้น:

  • window.location.host: คุณจะได้รับsub.domain.com:8080หรือsub.domain.com:80
  • window.location.hostname : คุณจะได้รับ sub.domain.com
  • window.location.protocol : คุณจะได้รับ http:
  • window.location.port: คุณจะได้รับ8080หรือ80
  • window.location.pathname : คุณจะได้รับ /virtualPath
  • window.location.origin: คุณจะได้รับhttp://sub.domain.com*****

อัพเดท: เกี่ยวกับ. origin

***** ตามสถานะการอ้างอิงความเข้ากันได้ของเบราว์เซอร์สำหรับwindow.location.originยังไม่ชัดเจน ฉันได้ตรวจสอบมันด้วยโครเมี่ยมและมันกลับมาhttp://sub.domain.com:portถ้าพอร์ตเป็นอะไร แต่ 80 และhttp://sub.domain.comถ้าพอร์ตคือ 80

ขอขอบคุณ @torazaburo เป็นพิเศษสำหรับการกล่าวถึงฉัน


ฉันมีเว็บไซต์และแอพพลิเคชั่น 2 ตัวใน IIS เช่นsub.domain.com/v1และsub.domain.com/v2และหน้าเช่นsub.domain.com/v1/Default.aspx หรือsub.domain.com/v2/Products/Default.aspxเป็นต้นฉันจะทำอย่างไร จะได้รับค่า/ v2รากสำหรับใบสมัครของฉันsub.domain.com/v2 ?
Kiquenet

@Kiquenet ใช้ javascript IDE เช่น WebStorm คุณจะเห็นตัวเลือกที่เป็นไปได้เมื่อคุณเขียนโค้ด
Bhargav Nanekalva

3
window.location.originไม่ได้กำหนดใน IE9 (ตามลิงก์คือ IE11 +) คำตอบนี้ช่วย
Neolisk

1
เห็นได้ชัดว่ามีประโยชน์สำหรับเกือบทุกคนยกเว้นจะไม่ตอบคำถามซึ่งเป็นวิธีการแยกส่วนโฮสต์ออกจาก URL ตลกคำตอบที่ถูกต้องด้วยฟังก์ชั่น getRootUrl มีเพียง 17 vs 609 โหวต
มิโร

@Miro ตอบคำถามไม่ได้มันเป็นหัวข้อย่อยที่ 2 ตอบคำถาม: window.location.hostname: คุณจะได้รับ sub.domain.com
พอล

155

คุณสามารถต่อโปรโตคอลตำแหน่งและโฮสต์:

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

สำหรับ url สมมติว่า'http://stackoverflow.com/questions'มันจะกลับมา'http://stackoverflow.com'


5
ดูเหมือนว่าคุณควรใช้ "ชื่อโฮสต์" แทน "โฮสต์" เพื่อให้ได้ผลลัพธ์ดังกล่าว แหล่งที่มา: stackoverflow.com/questions/6725890/…
417669

คุณสามารถใช้ location.origin พร้อมผลลัพธ์เดียวกัน
Sérgio

1
คำถามเดิมไม่ได้ขอส่วนโปรโตคอลของ URL
Simon East

36

ใช้document.locationวัตถุและhostหรือhostnameคุณสมบัติ

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

29

คำตอบที่ได้รับการยอมรับไม่ได้ผลสำหรับฉันเนื่องจากต้องการที่จะทำงานกับ url ของ URL ใด ๆ ไม่ใช่แค่ URL ของหน้าปัจจุบัน

ลองดูที่URLวัตถุ :

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
ขอบคุณ. หลายชั่วโมงที่ฉันค้นหาวิธีการสกัด URL ที่ฉันได้รับจาก API มันง่ายมาก ฉันอ่าน URL ด้วย URL ใหม่เท่านั้น ขอบคุณ.
Nodirabegimxonoyim

1
+99999999999999
ADJenks

หนึ่งในสองคำตอบที่นี่ที่ไม่คิดว่าคุณจะอยู่ฝั่งเบราว์เซอร์ของสิ่งต่าง ๆ ...
Will59

ไม่ทำงานบน IE11 :(
Teoman shipahi

24

มีสองวิธี ข้อแรกคือชุดคำตอบอื่นที่นี่ แต่อันนี้บัญชีสำหรับพอร์ตที่ไม่ใช่ค่าเริ่มต้น:

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) : "");
}

แต่ฉันชอบวิธีที่ง่ายกว่านี้ (ซึ่งใช้ได้กับสตริง URI):

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

3
ขอบคุณ! ฉันชอบวิธีที่ 2 ดีกว่าเช่นกัน! โดยเฉพาะอย่างยิ่งเมื่อใช้จาวาสคริปต์ฝั่งเซิร์ฟเวอร์ไม่มีวิธีรับ window.location :)
trillions

หนึ่งในสองคำตอบที่นี่ที่ไม่ถือว่าคุณอยู่ด้านเบราว์เซอร์ของสิ่ง ... แต่ตรวจสอบล่าสุดจาก Martin Konecny ​​โดยใช้ URL ใหม่
Will59

7

ใช้

window.location.origin

และสำหรับ: " http://aaa.bbb.ccc.ddd.com/sadf.aspx?blah "

คุณจะได้รับ: http://aaa.bbb.ccc.ddd.com/


เป็นสิ่งที่ดี แต่ควรได้รับการเตือนว่าดูเหมือนว่าจะไม่ทำงานบน IE11 + WIN7 developer.microsoft.com/en-us/microsoft-edge/platform/issues/ …
โนบิตะ


3

มีแฮ็คอื่นที่ฉันใช้และไม่เคยเห็นในการตอบสนอง StackOverflow ใด ๆ : การใช้แอตทริบิวต์ "src" ของรูปภาพจะให้เส้นทางพื้นฐานที่สมบูรณ์ของเว็บไซต์ของคุณ ตัวอย่างเช่น

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

ที่ URL เช่นhttp://domain.com/somesite/index.html, rootจะถูกตั้งค่าhttp://domain.com/somesite/จะถูกตั้งค่าวิธีนี้ใช้ได้กับ localhost หรือ URL พื้นฐานที่ถูกต้อง

โปรดทราบว่านี่จะทำให้คำขอ HTTP ที่ล้มเหลวใน $ภาพจำลอง คุณสามารถใช้ภาพที่มีอยู่แทนเพื่อหลีกเลี่ยงปัญหานี้โดยมีการเปลี่ยนแปลงโค้ดเพียงเล็กน้อยเท่านั้น

อีกตัวแปรหนึ่งใช้ลิงก์จำลองโดยไม่มีผลข้างเคียงกับคำขอ HTTP:

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

ฉันไม่ได้ทดสอบกับเบราว์เซอร์ทุกตัว


3

ตรวจสอบสิ่งนี้:

alert(window.location.hostname);

จะส่งคืนชื่อโฮสต์เป็น www.domain.com

และ:

window.location.host

จะคืนชื่อโดเมนด้วยพอร์ตเช่น www.example.com:80

สำหรับการอ้างอิงที่สมบูรณ์ตรวจสอบเว็บไซต์ผู้พัฒนา Mozilla


2

ฉันต้องการระบุบางสิ่ง หากมีคนต้องการได้ URL ทั้งหมดพร้อมเส้นทางอย่างที่ฉันต้องการสามารถใช้:

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

ทำไมไปอีกต่อไป สามารถรับได้ด้วย var fullUrl = window.location.origin + window.location.pathname
อนันต์

แต่บางครั้งคุณต้องการที่จะเพิ่มสิ่งที่ต้องการโดเมนย่อยระหว่างโปรโตคอลและชื่อโฮสต์เช่นภาษา ฯลฯ
crx4

2

ฉันรู้ว่ามันช้าไปหน่อย แต่ฉันทำฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่สะอาดด้วยไวยากรณ์ ES6 เล็กน้อย

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

มันอาจจะเขียนใน ES5 เช่น

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

แน่นอน IE ไม่สนับสนุนObject.assignแต่ในสายงานของฉันที่ไม่สำคัญ


1

Regex ให้ความยืดหยุ่นมากกว่า

    //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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.