รับชื่อโดเมนปัจจุบันด้วย Javascript (ไม่ใช่เส้นทาง ฯลฯ )


246

ฉันวางแผนที่จะซื้อชื่อโดเมนสองชื่อสำหรับเว็บไซต์เดียวกัน ฉันวางแผนที่จะให้ข้อมูลที่แตกต่างกันเล็กน้อยบนหน้าเว็บทั้งนี้ขึ้นอยู่กับโดเมนที่ใช้ มีวิธีที่ฉันจะตรวจสอบชื่อโดเมนจริงที่หน้ากำลังโหลดจากเพื่อให้ฉันรู้ว่าสิ่งที่จะเปลี่ยนเนื้อหาของฉันไป?

ฉันดูรอบ ๆ เพื่อสิ่งนี้ แต่ส่วนใหญ่ไม่ได้ทำงานอย่างที่ฉันต้องการ

ตัวอย่างเช่นเมื่อใช้

document.write(document.location)

บนJSFiddleจะส่งคืน

http://fiddle.jshell.net/_display/

เช่นเส้นทางที่เกิดขึ้นจริงหรืออะไรก็ตามที่เป็น


1
ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณต้องการทำหรือไม่ แต่คุณควรจะดูMDNเกี่ยวกับเรื่องนี้
MilkyWayJoe

หัวข้อเล็กน้อย แต่คุณสามารถพิจารณาให้มีโดเมนย่อยแทนชื่อโดเมนสองชื่อ มีบางอย่างที่เหมือนกันpremium.random.comและfree.random.com
T.Chmelevskij

คำตอบ:


456

เกี่ยวกับ:

window.location.hostname

locationวัตถุจริงมีจำนวนของคุณลักษณะหมายถึงชิ้นส่วนที่แตกต่างกันของ URL


55
และwindow.location.hostnameถ้าคุณไม่ต้องการที่จะได้รับport(เช่นhttp://localhost:3000/, window.location.host = 'localhost:3000'และwindow.location.hostname = 'localhost'
Guilherme

6
คำตอบนั้นผิดเพราะพอร์ตไม่ได้อยู่ในโดเมน และwindow.location.hostบางครั้งจะให้พอร์ตกลับคืน
Andrej

4
สิ่งนี้จะส่งคืนชื่อเซิร์ฟเวอร์ ('www.amazingjokes.com' แทนที่จะเป็นเพียง '.amazingjokes.com')
Patrick

ในกรณีที่คุณมีการส่งต่อ DNS คุณอาจต้องใช้สิ่งนี้ - window.location.ancestorOrigins
Kirill Gusyatin

126

ลองเรียกใช้ใน script: path: http: // localhost: 4200 / landing? query = 1 # 2

console.log(window.location.hash)

ตำแหน่งมีค่าต่อไปนี้:

window.location.hash: "#2"

window.location.host: "localhost:4200"

window.location.hostname: "localhost"

window.location.href: "http://localhost:4200/landing?query=1#2"

window.location.origin: "http://localhost:4200"

window.location.pathname: "/landing"

window.location.port: "4200"

window.location.protocol: "http:"

window.location.search: "?query=1"

3
นี่เป็นคำตอบที่ยอดเยี่ยมมาก!
Andrew Campbell ใน

2
ฉันรักคำตอบด้วยตัวอย่างมากมาย ขอบคุณมาก ๆ.
Magno Alberto

24

หากคุณไม่สนใจชื่อโฮสต์ (ตัวอย่างwww.beta.example.com) แต่อยู่ในชื่อโดเมน (ตัวอย่างexample.com) สิ่งนี้ใช้ได้กับชื่อโฮสต์ที่ถูกต้อง:

function getDomainName(hostName)
{
    return hostName.substring(hostName.lastIndexOf(".", hostName.lastIndexOf(".") - 1) + 1);
}

13
ไม่ถูกต้องสิ่งนี้จะทำลาย TLD ระหว่างประเทศเกือบทั้งหมด
tbranyen

4
@tbranyen คุณสามารถอธิบายสิ่งที่คุณหมายถึงอะไร กรณีเดียวที่ฉันคิดได้คือโดเมนย่อยเช่นamazon.co.ukนั้น แต่ไม่แน่นอน "TLD นานาชาติเกือบทั้งหมด" อันที่จริงมันใช้งานได้กับรหัสประเทศ
cprcrack

1
cprcrack ด้วยเหตุผลบางอย่างฉันคิดว่า tlds สากล (ไปอเมริกา) มีหลายจุด ขอบคุณสำหรับการแก้ไข!
tbranyen

หลายประเทศทำงานคล้ายกับสหราชอาณาจักร: พวกเขามีโดเมนระดับที่สองคงที่และคุณสามารถลงทะเบียนโดเมนได้ในระดับที่สามเท่านั้น รายชื่อของประเทศเหล่านั้นเป็นวิกิพีเดีย
Gareth

18
function getDomain(url, subdomain) {
    subdomain = subdomain || false;

    url = url.replace(/(https?:\/\/)?(www.)?/i, '');

    if (!subdomain) {
        url = url.split('.');

        url = url.slice(url.length - 2).join('.');
    }

    if (url.indexOf('/') !== -1) {
        return url.split('/')[0];
    }

    return url;
}

ตัวอย่าง

รุ่นก่อนหน้าได้รับโดเมนแบบเต็ม (รวมถึงโดเมนย่อย) ตอนนี้มันจะกำหนดโดเมนที่ถูกต้องขึ้นอยู่กับการตั้งค่า ดังนั้นเมื่อมีการระบุอาร์กิวเมนต์ที่ 2 เป็นจริงมันจะรวมโดเมนย่อยมิฉะนั้นจะส่งกลับเฉพาะ 'โดเมนหลัก'


1
นี้ควรจะเป็นคำตอบที่จะทำงานได้แม้ในและที่ตอบที่ถูกต้องlocalhost/test.php localhost
Mohammad AlBanna

นอกจากนี้ยังเป็นคำตอบที่ดีที่สุดเพราะใช้ได้กับ URL ใด ๆ ที่คุณส่งผ่านไม่ใช่เฉพาะหน้าต่างปัจจุบันสถานที่
sohtimsso1970

หากคุณทำเช่นนี้เพื่อgoogle.co.ukคุณจะได้รับ 'co.uk' กลับมาซึ่งไม่ถูกต้อง ...
James Douglas

ใช่. นั่นเป็นธุรกิจที่ยุ่งยาก แม้จะมีเล่ห์เหลี่ยมหากคุณมีโดเมนย่อยด้วย (เช่น: test.google.co.uk) หากคุณต้องการใช้เวอร์ชันดิบนี้จำเป็นต้องมีการปรับเปลี่ยนที่ร้ายแรง (อาจเพิ่มรายการพิเศษสำหรับ tld เหล่านั้น)
adelineu

10

คุณสามารถรับได้จากวัตถุตำแหน่งใน Javascript ได้อย่างง่ายดาย:

ตัวอย่าง URL ของหน้านี้คือ:

http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc

จากนั้นเราจะได้โดเมนที่แน่นอนพร้อมด้วยคุณสมบัติของวัตถุตำแหน่ง

location.host = "www.stackoverflow.com"
location.protocol= "http:"

คุณสามารถสร้างโดเมนแบบเต็มด้วย:

location.protocol + "//" + location.host

ซึ่งในตัวอย่างนี้ส่งคืน http://www.stackoverflow.com

ฉันนอกจากนี้เราจะได้รับ URL เต็มและเส้นทางที่มีคุณสมบัติอื่น ๆ ของวัตถุที่ตั้ง:

location.href= "http://www.stackoverflow.com/questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"    
location.pathname= "questions/11401897/get-the-current-domain-name-with-javascript-not-the-path-etc"

7

หากคุณมีความสนใจเฉพาะในชื่อโดเมนและต้องการที่จะไม่สนใจโดเมนย่อยแล้วคุณจะต้องแยกมันออกจากและhosthostname

รหัสต่อไปนี้ทำสิ่งนี้:

var firstDot = window.location.hostname.indexOf('.');
var tld = ".net";
var isSubdomain = firstDot < window.location.hostname.indexOf(tld);
var domain;

if (isSubdomain) {
    domain = window.location.hostname.substring(firstDot == -1 ? 0 : firstDot + 1);
}
else {
  domain = window.location.hostname;
}

http://jsfiddle.net/5U366/4/


ทำไมมันถึงส่งคืน jShell แทนที่จะเป็น jsFiddle?
Freesnöw

2
@XanderLamkins: มันคือ iframe: jsfiddle.net/5U366 <-> fiddle.jshell.net/5U366/show
Saxoier

7

เนื่องจากคำถามนี้ถามชื่อโดเมนไม่ใช่ชื่อโฮสต์คำตอบที่ถูกต้องควรเป็น

window.location.hostname.split('.').slice(-2).join('.')

สิ่งนี้ใช้ได้กับชื่อโฮสต์เช่นwww.example.comด้วย


1
ใช้งานได้ แต่ไม่ทำงานกับโดเมนเช่น domain.co.uk, domain.com.br .. ฉันจะทำงานกับโดเมนใดได้อย่างไร
Sameh


5

หากคุณต้องการที่มาของโดเมนแบบเต็มคุณสามารถใช้สิ่งนี้:

document.location.origin

และถ้าคุณต้องการที่จะได้รับโดเมนเท่านั้นใช้คุณได้แค่นี้

document.location.hostname

แต่คุณมีตัวเลือกอื่น ๆ ดูที่คุณสมบัติใน:

document.location

5

ฟังก์ชั่นนี้เกี่ยวกับอะไร?

window.location.hostname.match(/\w*\.\w*$/gi)[0]

สิ่งนี้จะจับคู่เฉพาะชื่อโดเมนโดยไม่คำนึงว่าเป็นโดเมนย่อยหรือโดเมนหลัก


1
ฉันชอบคำตอบนี้ แต่คุณควรระวังว่าถ้าใช้เพื่อจุดประสงค์ด้านความปลอดภัยก็สามารถข้ามได้ คือถ้าคุณต้องการให้แน่ใจว่าคุณอยู่ใน example.com จากนั้นแฮ็กเกอร์ - example.com ก็จะเท่ากับ 'example.com' window.location.hostname.match (/ [a-zA-Z0-9 -] * \. [a-zA-Z0-9 -] * $ /) [0] ใช้งานได้
hiburn8

4

หากคุณต้องการรับชื่อโดเมนใน JavaScript เพียงใช้รหัสต่อไปนี้:

var domain_name = document.location.hostname;
alert(domain_name);

หากคุณต้องการเส้นทาง URL ของหน้าเว็บเพื่อให้คุณสามารถเข้าถึงเส้นทาง URL ของเว็บใช้ตัวอย่างนี้:

var url = document.URL;
alert(url);


1

ฉันใหม่กับ JavaScript แต่ไม่สามารถใช้เพียง: document.domain ?

ตัวอย่าง:

<p id="ourdomain"></p>

<script>
var domainstring = document.domain;
document.getElementById("ourdomain").innerHTML = (domainstring);
</script>

เอาท์พุท:

domain.com

หรือ

www.domain.com

ขึ้นอยู่กับสิ่งที่คุณใช้บนเว็บไซต์ของคุณ


0

ฉันคิดว่ามันควรจะง่ายอย่างนี้

url.split("/")[2]


ใช้งานได้สำหรับฉัน โซลูชันก่อนหน้านี้ใช้เอกสารตำแหน่งหรือวัตถุหน้าต่าง
Cris

0

เมื่อรวมคำตอบจากข้างบนเข้าด้วยกันสิ่งต่อไปนี้ใช้ได้ดีสำหรับฉันในการทำลายคุกกี้:

  /**
   * Utility method to obtain the domain URI:
   */
  fetchDomainURI() {
    if (window.location.port.length > 0) {
      return window.location.hostname;
    }
    return `.${window.location.hostname.match(/\w*\.\w*$/gi)[0]}`;
  }

ใช้งานได้สำหรับที่อยู่ IP ที่มีพอร์ตเช่น 0.0.0.0:8000 เป็นต้นรวมถึงโดเมนที่ซับซ้อนเช่นapp.staging.example.comreturn .example.com=> ช่วยให้สามารถตั้งค่าคุกกี้ข้ามโดเมนและทำลายได้


0

หากคุณต้องการชื่อโดเมนประเทศ - ตัวอย่างเช่นเพื่อแยก  . com   จาก stackoverflow.com:

(ES6):

const getCountryDomainName = () => {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

(ES5):

function getCountryDomainName() {
  let hostName = window.location.hostname;
  let lastDotIndex = hostName.lastIndexOf('.');
  let countryDomainName = hostName.substr(lastDotIndex+1, hostName.length);
  return countryDomainName;
}

จากนั้นใช้ฟังก์ชันเพื่อกำหนดค่าให้กับ var:

const countryDomainName = getCountryDomainName();

-2

@Brandito ขอบคุณเว็บไซต์ที่ถูกโฮสต์ใน AWS โฮสต์เสมือนฉันเชื่อว่าการใช้ wordpress และไม่รู้ว่าทำไมมันถึงมีปัญหาในการทำเช่นนั้น ... ไม่แน่ใจว่ามันเป็นการเปลี่ยนเส้นทางที่ผิด ด้วยกฎแบ็กเอนด์ mod เขียนใหม่ .. นอกจากนี้ฉันต้องการใช้ jipery ui ธีม toolip และไอคอนพร้อมกับมัน อนุมัติโดยลูกค้าเป็นครั้งแรกแน่นอน: '-)
Jean Paul AKA el_vete
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.