Cara mengekstrak bagian hostname dari URL dalam JavaScript


379

Apakah ada cara yang sangat mudah untuk memulai dari URL lengkap:

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

Dan ekstrak hanya bagian host:

aaa.bbb.ccc.com

Pasti ada fungsi JavaScript yang bisa diandalkan, tapi saya tidak bisa menemukannya.

Jawaban:


827

anggaplah bahwa Anda memiliki halaman dengan alamat ini: http://sub.domain.com/virtualPath/page.htm. gunakan kode halaman berikut ini untuk mencapai hasil tersebut:

  • window.location.host: Anda akan mendapatkan sub.domain.com:8080atausub.domain.com:80
  • window.location.hostname : Anda akan mendapatkannya sub.domain.com
  • window.location.protocol : Anda akan mendapatkannya http:
  • window.location.port: Anda akan mendapatkan 8080atau80
  • window.location.pathname : Anda akan mendapatkannya /virtualPath
  • window.location.origin: Anda akan mendapatkan http://sub.domain.com*****

Perbarui: tentang .origin

***** Sebagai negara referensi , kompatibilitas browser untuk window.location.origintidak jelas. Saya telah memeriksanya di chrome dan mengembalikannya http://sub.domain.com:portjika portnya tidak lebih dari 80, dan http://sub.domain.comjika portnya adalah 80.

Terima kasih khusus kepada @torazaburo karena menyebutkan hal itu kepada saya.


Saya memiliki situs web dan 2 aplikasi di IIS. Contoh: sub.domain.com/v1 dan sub.domain.com/v2 dan halaman seperti sub.domain.com/v1/Default.aspx atau sub.domain.com/v2/Products/Default.aspx , dll. Bagaimana Saya dapat memperoleh nilai / v2 , root untuk sub.domain.com/v2 aplikasi saya ?
Kiquenet

@Kiquenet menggunakan IDE javascript seperti WebStorm, Anda bisa melihat opsi yang mungkin saat Anda menulis kode.
Bhargav Nanekalva

3
window.location.origintidak terdefinisi di IE9 (menurut tautan, itu IE11 +). Jawaban ini membantu.
Neolisk

1
Jelas sangat membantu bagi hampir semua orang kecuali itu tidak menjawab pertanyaan yang merupakan cara mengekstrak bagian host dari URL. Lucu jawaban yang benar dengan fungsi getRootUrl hanya memiliki 17 vs 609 suara.
Miro

@Miro pertanyaan dijawab bukan, poin ke-2 menjawab pertanyaan: window.location.hostname: Anda akan mendapatkan sub.domain.com
Paul

155

Anda dapat menggabungkan protokol lokasi dan host:

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

Untuk url, katakanlah 'http://stackoverflow.com/questions', itu akan kembali'http://stackoverflow.com'


5
sepertinya Anda harus menggunakan "hostname" daripada "host" untuk mencapai hasil di atas. sumber: stackoverflow.com/questions/6725890/…
user417669

Anda dapat menggunakan location.origin dengan hasil yang sama.
Sérgio

1
Pertanyaan asli tidak menanyakan bagian protokol dari URL.
Simon East

36

Gunakan document.locationobjek dan nya hostatau hostnameproperti.

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

29

Jawaban yang diterima tidak berfungsi untuk saya karena ingin dapat bekerja dengan url arbiter apa pun, bukan hanya URL halaman saat ini.

Lihatlah URLobjeknya :

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
Terima kasih. Selama berjam-jam saya telah mencari metode untuk mengekstrak url yang saya dapatkan dari api. Itu sangat sederhana. Saya hanya membacanya di url dengan URL baru. Terima kasih.
Nodirabegimxonoyim

1
+99999999999999
ADJenks

Salah satu dari dua jawaban di sini yang tidak menganggap Anda berada di sisi browser ...
Will59

tidak bekerja pada IE11 :(
Teoman shipahi

24

Ada dua cara. Yang pertama adalah varian dari jawaban lain di sini, tetapi yang ini bertanggung jawab untuk port non-default:

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

Tapi saya lebih suka metode yang lebih sederhana ini (yang bekerja dengan string URI):

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

3
Terima kasih! Saya juga menyukai metode ke-2! terutama ketika di sisi server javascript, tidak ada cara untuk mendapatkan window.location :)
trilyunan

Salah satu dari dua jawaban di sini yang tidak menganggap Anda berada di sisi peramban ... Tapi periksa yang lebih baru dari Martin Konecny ​​menggunakan URL baru.
Will59



3

Ada peretasan lain yang saya gunakan dan tidak pernah dilihat dalam respons StackOverflow: menggunakan atribut "src" dari sebuah gambar akan menghasilkan jalur basis lengkap dari situs Anda. Contohnya :

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

Pada URL suka http://domain.com/somesite/index.html, rootakan diatur ke http://domain.com/somesite/. Ini juga berfungsi untuk localhost atau URL dasar yang valid.

Perhatikan bahwa ini akan menyebabkan permintaan HTTP gagal pada $gambar dummy. Anda dapat menggunakan gambar yang sudah ada sebagai gantinya untuk menghindari ini, dengan hanya sedikit perubahan kode.

Varian lain menggunakan tautan dummy, tanpa efek samping pada permintaan HTTP:

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

Saya tidak mengujinya di setiap browser.


3

Periksa ini:

alert(window.location.hostname);

ini akan mengembalikan nama host sebagai www.domain.com

dan:

window.location.host

akan mengembalikan nama domain dengan port like www.example.com:80

Untuk referensi lengkap, periksa situs pengembang Mozilla .


2

Saya ingin menentukan sesuatu. Jika seseorang ingin mendapatkan seluruh url dengan jalur seperti yang saya butuhkan, dapat menggunakan:

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

mengapa pergi jauh. Itu bisa didapat dengan var fullUrl = window.location.origin + window.location.pathname
Anant

tetapi kadang-kadang Anda ingin menambahkan sesuatu seperti subdomain antara protokol dan nama host mis. multilanguage dll.
crx4

2

Saya tahu ini agak terlambat, tapi saya membuat sedikit fungsi bersih dengan sedikit sintaks ES6

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

Bisa juga ditulis dalam ES5 suka

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

Tentu saja IE tidak mendukung Object.assign, tetapi dalam pekerjaan saya, itu tidak masalah.


1

Regex memberikan lebih banyak fleksibilitas.

    //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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.