location.host vs location.hostname และความเข้ากันได้ข้ามเบราว์เซอร์?


365

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

เราต้องการแสดงคำเตือนสไตล์ 'แถบด้านบน' ของ js ขนาดเล็กหากพวกเขาเข้าถึงโดเมนโดยใช้เว็บพร็อกซีบางประเภท (เนื่องจากมีแนวโน้มที่จะทำลาย js)

เรากำลังคิดที่จะใช้สิ่งต่อไปนี้:

var r = /.*domain\.com$/;
if (r.test(location.hostname)) {
    // showMessage ...
}

นั่นจะดูแลโดเมนย่อยที่เราเคยใช้

เราควรใช้ชื่อโฮสต์หรือชื่อโฮสต์ใด

ใน Firefox 5 และ Chrome 12:

console.log(location.host);
console.log(location.hostname);

.. แสดงเหมือนกันสำหรับทั้งคู่

นั่นเป็นเพราะพอร์ตไม่ได้อยู่ในแถบที่อยู่จริงหรือ

W3Schoolsกล่าวว่าโฮสต์มีพอร์ต

ควรมีการตรวจสอบความถูกต้อง location.host/hostname หรือไม่หรือเราจะค่อนข้างมั่นใจใน IE6 + และคนอื่น ๆ ทั้งหมดจะมีอยู่หรือไม่


6
สิ่งหนึ่งที่ควรทราบคือ google chrome มีตำแหน่งต้นกำเนิดที่ MSIE และ Firefox ไม่มี developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo


คำตอบ:


1063

กายวิภาคเชื่อมโยงเชิงโต้ตอบ

ในฐานะที่เป็นบันทึกเล็ก ๆ น้อย ๆ : กายวิภาคเชื่อมโยงแบบโต้ตอบ

-

ในระยะสั้น (สมมติว่าเป็นที่ตั้งของhttp://example.org:8888/foo/bar#bang):

  • hostname ให้คุณ example.org
  • host ให้คุณ example.org:8888

87
ภาพที่มีค่าพันคำ.
Jack Giffin

4
@lolzerywowzery ... แต่มีเพียงพันคำเท่านั้นที่จำเป็นต้องใช้ในการอธิบายภาพ
Agi Hammerthief

1
ตามen.wikipedia.org/wiki/ …พอร์ตไม่ควรพิจารณาเป็นส่วนหนึ่งของโฮสต์ (แต่เป็นส่วนหนึ่งของผู้มีอำนาจ)
อเล็กซ์

@Alec นี่เป็นบันทึกทางเทคนิคที่น่าสนใจ การเจาะลึกผ่านการอ้างอิงของ Wikipedia พบว่าตาม RFC 3986 "ผู้มีอำนาจ" ควรจะเป็นคำสำหรับการต่อเชื่อมชื่อโฮสต์:และพอร์ต ฉันสงสัยว่าการอภิปรายยังคงมีอยู่เท่าไรเมื่อlocation.hostมีการกำหนด ... ฉันสงสัยว่าชื่อนี้วันนี้เพราะไม่มีใครเคยอ่านหรือคิดที่จะพูดถึง RFC
JamesTheAwesomeDude

ขอบคุณมากสำหรับคำตอบง่ายๆ
Tarun Nagpal

70

โฮสต์จะรวมหมายเลขพอร์ตหากมีการระบุไว้ หากไม่มีหมายเลขพอร์ตเฉพาะใน URL แสดงว่าเป็นชื่อโฮสต์ คุณเลือกได้ว่าคุณต้องการจับคู่หมายเลขพอร์ตหรือไม่ ดูhttps://developer.mozilla.org/en/window.locationสำหรับข้อมูลเพิ่มเติม

ฉันจะสมมติว่าคุณต้องการชื่อโฮสต์ที่จะได้รับชื่อเว็บไซต์


33

หากคุณยืนยันที่จะใช้window.location.origin คุณสามารถใส่รหัสนี้ไว้ด้านบนของรหัสของคุณก่อนที่จะอ่านorigin

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

สารละลาย

PS: สำหรับบันทึกมันเป็นคำถามเดิมจริง ๆ ได้รับการแก้ไขแล้ว :)


5
แต่ .... OP ไม่เคยเอ่ยถึงwindow.location.originในคำถามของพวกเขา คำถามของพวกเขาเป็นจริงโดยเฉพาะเกี่ยวกับสิ่งที่เป็นไม่ได้ window.location.origin
Winderps

1
นอกจากนี้ยังเป็นที่น่าสังเกตว่า window.location.origin มีปัญหาความเข้ากันได้ของเบราว์เซอร์ developer.mozilla.org/en-US/docs/Web/API/Window/…
Scott

10

คำถามหลักของคุณได้รับคำตอบข้างต้น ฉันแค่อยากจะชี้ให้เห็นว่า regex ที่คุณใช้มีข้อบกพร่อง มันจะประสบความสำเร็จfoo-domain.comซึ่งไม่ใช่โดเมนย่อยของdomain.com

สิ่งที่คุณต้องการคือ:

/(^|\.)domain\.com$/


0

เพียงเพิ่มบันทึกย่อที่เบราว์เซอร์ Google Chrome มีแอตทริบิวต์ต้นกำเนิดสำหรับตำแหน่ง ซึ่งให้ทั้งโดเมนจากโปรโตคอลไปยังหมายเลขพอร์ตตามที่แสดงในภาพหน้าจอด้านล่าง เครื่องมือสำหรับนักพัฒนา chrome

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