location.host vs location.hostname dan kompatibilitas lintas-browser?

365

Yang mana di antara ini adalah yang paling efektif vs memeriksa apakah agen pengguna mengakses melalui domain yang benar.

Kami ingin menampilkan peringatan gaya 'top bar' berbasis js kecil jika mereka mengakses domain menggunakan semacam proxy web (karena cenderung merusak js).

Kami berpikir untuk menggunakan yang berikut ini:

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

Itu akan menangani semua subdomain yang pernah kami gunakan.

Yang mana yang harus kita gunakan host atau nama host?

Di Firefox 5 dan Chrome 12:

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

..menunjukkan hal yang sama untuk keduanya.

Apakah itu karena port sebenarnya tidak ada di bilah alamat?

W3Schools mengatakan host berisi port.

Haruskah location.host/hostname divalidasi atau bisakah kita cukup yakin di IE6 + dan semua yang lain itu akan ada?

anonim-satu
sumber
6
Satu hal yang perlu diperhatikan adalah bahwa google chrome memiliki location.origin, di mana MSIE dan Firefox tidak. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo

Jawaban:

1064

anatomi tautan interaktif

Sebagai memo kecil: anatomi tautan interaktif

-

Singkatnya (dengan asumsi lokasi http://example.org:8888/foo/bar#bang):

  • hostname Memberi anda example.org
  • host Memberi anda example.org:8888
lebih baik
sumber
87
Sebuah gambar bernilai ribuan kata.
Jack Giffin
4
@lolzerywowzery ... tetapi hanya seribu kata yang diperlukan untuk menggambarkan gambar
Agi Hammerthief
1
Menurut en.wikipedia.org/wiki/… , port tidak boleh dianggap sebagai bagian dari host (tetapi itu adalah bagian dari otoritas).
Alec
@Alec ini adalah catatan teknis yang menarik; menelusuri melalui kutipan Wikipedia mengungkapkan bahwa, menurut RFC 3986, "otoritas" harus menjadi istilah untuk penggabungan nama host :,, dan port. Saya bertanya-tanya berapa banyak diskusi masih tersedia dari ketika location.hostsedang dirumuskan ... Saya menduga itu dinamai hari ini karena tidak ada yang hadir telah membaca atau berpikir untuk menyebutkan RFC itu.
JamesTheAwesomeDude
Terima kasih banyak atas solusi sederhana
Tarun Nagpal
70

host hanya menyertakan nomor port jika ada yang ditentukan. Jika tidak ada nomor port khusus di URL, maka itu mengembalikan sama dengan nama host. Anda memilih apakah Anda ingin mencocokkan nomor port atau tidak. Lihat https://developer.mozilla.org/en/window.location untuk info lebih lanjut.

Saya akan menganggap Anda ingin nama host hanya mendapatkan nama situs.

pacar00
sumber
33

Jika Anda bersikeras untuk menggunakan window.location.origin Anda dapat menempatkan ini di atas kode Anda sebelum membacaorigin

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

Larutan

PS: Sebagai catatan, itu sebenarnya pertanyaan awal. Sudah diedit :)

Kenneth Palaganas
sumber
5
Tapi .... OP tidak pernah disebutkan window.location.origindalam pertanyaan mereka. Pertanyaan mereka sebenarnya khusus mengenai hal-hal yang tidak window.location.origin .
Winderps
1
Perlu juga dicatat bahwa window.location.origin memiliki masalah kompatibilitas browser. developer.mozilla.org/en-US/docs/Web/API/Window/…
Scott
10

Pertanyaan utama Anda telah dijawab di atas. Saya hanya ingin menunjukkan bahwa regex yang Anda gunakan memiliki bug. Ini juga akan berhasil foo-domain.comyang bukan merupakan subdomain daridomain.com

Apa yang benar-benar Anda inginkan adalah ini:

/(^|\.)domain\.com$/
bluesmoon
sumber
0

Hanya untuk menambahkan catatan bahwa browser Google Chrome memiliki atribut asal untuk lokasi. yang memberi Anda seluruh domain dari protokol ke nomor port seperti yang ditunjukkan pada gambar di bawah. alat pengembang krom

Gopi P
sumber