Dapatkan Nama Domain Saat Ini Dengan Javascript (Bukan path, dll.)


246

Saya berencana membeli dua nama domain untuk situs yang sama. Bergantung pada domain mana yang digunakan, saya berencana menyediakan data yang sedikit berbeda pada halaman. Apakah ada cara bagi saya untuk mendeteksi nama domain sebenarnya dari mana halaman memuat sehingga saya tahu apa yang harus mengubah konten saya?

Saya sudah mencari-cari hal-hal seperti ini tetapi sebagian besar tidak berfungsi seperti yang saya inginkan.

Misalnya saat menggunakan

document.write(document.location)

di JSFiddle ia kembali

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

yaitu jalan yang sebenarnya atau apa pun itu.


1
Saya tidak yakin apakah saya mengerti persis apa yang ingin Anda lakukan, tetapi Anda mungkin harus melihat ke MDN dalam hal ini
MilkyWayJoe

Sedikit topik, tetapi Anda juga bisa mempertimbangkan memiliki subdomain daripada dua nama domain terpisah. Sesuatu seperti premium.random.comdanfree.random.com
T.Chmelevskij

Jawaban:


456

Bagaimana tentang:

window.location.hostname

The locationobjek sebenarnya memiliki sejumlah atribut mengacu pada bagian yang berbeda dari URL


55
dan window.location.hostnamejika Anda tidak ingin mendapatkan port(seperti http://localhost:3000/, window.location.host = 'localhost:3000'danwindow.location.hostname = 'localhost'
Guilherme

6
Jawabannya salah karena port bukan milik domain. Dan window.location.hostterkadang akan memberikan port kembali.
Andrej

4
Ini juga mengembalikan nama server ('www.amazingjokes.com', bukan hanya '.amazingjokes.com')
patrick

Jika Anda memiliki penerusan DNS, Anda mungkin memerlukan yang ini - window.location.ancestorOrigins
Kirill Gusyatin

128

Coba jalankan di skrip: path: http: // localhost: 4200 / landing? Query = 1 # 2

console.log(window.location.hash)

Lokasi memiliki nilai berikut:

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
Ini jawaban yang bagus!
Andrew Campbell

2
Saya suka jawaban dengan beberapa contoh. Terima kasih banyak.
Magno Alberto

24

Jika Anda tidak tertarik dengan nama host (misalnya www.beta.example.com) tetapi pada nama domain (misalnya example.com), ini berfungsi untuk nama host yang valid:

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

13
Salah, ini akan merusak hampir semua TLD internasional.
tbranyen

4
@ tbranyen dapatkah Anda menjelaskan apa yang Anda maksud? Satu-satunya kasus yang bisa saya pikirkan adalah subdomain seperti amazon.co.uk. Tapi jelas bukan "hampir semua TLD internasional". Bahkan ia bekerja dengan 100% kode negara yang ditemukan di Wikipedia
cprcrack

1
cprcrack untuk beberapa alasan saya pikir tlds lebih internasional (ke Amerika) berisi beberapa titik. Terima kasih sudah mengoreksi!
tbranyen

Sejumlah negara bekerja serupa dengan Inggris: mereka telah memperbaiki domain tingkat kedua dan Anda hanya dapat mendaftarkan domain di tingkat ketiga. Daftar negara-negara tersebut ada di Wikipedia .
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;
}

Contohnya

Versi sebelumnya mendapatkan domain lengkap (termasuk subdomain). Sekarang ini menentukan domain yang tepat tergantung pada preferensi. Sehingga ketika argumen ke-2 diberikan sebagai true, ia akan menyertakan subdomain, jika tidak, ia hanya mengembalikan 'domain utama'


1
Ini harus menjadi jawaban, itu berfungsi bahkan di localhost/test.phpdan itu jawaban yang benar localhost.
Mohammad AlBanna

Ini juga jawaban terbaik karena berfungsi dengan URL apa pun yang Anda lewati, bukan hanya di window.location saat ini
sohtimsso1970

Jika Anda melakukan ini google.co.ukuntuk Anda akan mendapatkan 'co.uk' kembali, yang tidak benar ...
James Douglas

Iya. Itu bisnis yang sulit. Lebih rumit lagi jika Anda mendapat subdomain (seperti: test.google.co.uk). Jika Anda ingin menggunakan versi mentah ini diperlukan beberapa penyesuaian serius (bahkan mungkin menambahkan daftar khusus untuk tlds tersebut).
adelineu

10

Anda bisa mendapatkannya dari objek lokasi di Javascript dengan mudah:

Misalnya URL halaman ini adalah:

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

Kemudian kita bisa mendapatkan domain yang tepat dengan properti objek lokasi berikut:

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

Anda dapat membuat domain lengkap dengan:

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

Yang dalam contoh ini kembali http://www.stackoverflow.com

Saya tambahan ini kita bisa mendapatkan URL lengkap dan juga path dengan properti lain dari objek lokasi:

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

Jika Anda hanya tertarik pada nama domain dan ingin mengabaikan subdomain maka Anda perlu menguraikannya dari hostdan hostname.

Kode berikut melakukan ini:

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/


Mengapa itu mengembalikan jShell, bukan jsFiddle?
Freesnöw

2
@XanderLamkins: ini iframe: jsfiddle.net/5U366 <-> fiddle.jshell.net/5U366/show
Saxoier

7

Karena pertanyaan ini menanyakan nama domain, bukan nama host, jawaban yang benar seharusnya

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

Ini berfungsi untuk nama host seperti www.example.com juga.


1
Ini berfungsi tetapi tidak berfungsi dengan domain seperti domain.co.uk, domain.com.br .. Bagaimana saya bisa membuatnya bekerja dengan domain apa pun?
Sameh

6

Menggunakan

document.write(document.location.hostname)​

window.locationmemiliki banyak properti. Lihat di sini untuk daftar mereka.


5

Jika Anda menginginkan asal domain lengkap, Anda dapat menggunakan ini:

document.location.origin

Dan jika Anda hanya ingin mendapatkan domain, gunakan ini untuk Anda saja:

document.location.hostname

Tetapi Anda memiliki opsi lain, lihat properti di:

document.location

5

Bagaimana dengan fungsi ini?

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

Ini hanya akan cocok dengan nama domain, terlepas dari apakah itu subdomain atau domain utama


1
Saya suka jawaban ini. Tetapi Anda harus menyadari bahwa jika menggunakannya untuk tujuan yang berhubungan dengan keamanan .. itu dapat dilewati. Yaitu jika Anda ingin memastikan Anda berada di example.com, maka hacker-example.com juga akan sama dengan 'example.com'. window.location.hostname.match (/ [a-zA-Z0-9 -] * \. [a-zA-Z0-9 -] * $ /) [0] berfungsi.
hiburn8

4

Jika Anda ingin mendapatkan nama domain dalam JavaScript, cukup gunakan kode berikut:

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

Jika Anda perlu jalur URL halaman web sehingga Anda dapat mengakses jalur URL web gunakan contoh ini:

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


1

Saya baru mengenal JavaScript, tetapi tidak bisakah Anda menggunakan: document.domain ?

Contoh:

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

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

Keluaran:

domain.com

atau

www.domain.com

Tergantung pada apa yang Anda gunakan di situs web Anda.


0

Saya pikir itu harus sesederhana ini:

url.split("/")[2]


Bekerja untukku. Solusi sebelumnya bergantung pada dokumen, lokasi atau objek jendela.
Cris

0

Menggabungkan beberapa jawaban dari yang di atas, berikut ini bekerja dengan sangat baik bagi saya untuk menghancurkan Cookies:

  /**
   * 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]}`;
  }

Bekerja untuk alamat IP dengan port, misalnya, 0.0.0.0:8000 dll, serta domain kompleks seperti app.staging.example.compengembalian .example.com=> memungkinkan pengaturan dan penghancuran cookie lintas domain.


0

Jika Anda ingin nama domain negara - misalnya untuk mengekstrak  .com   dari 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;
}

Kemudian, cukup gunakan fungsi untuk menetapkan nilai ke var:

const countryDomainName = getCountryDomainName();

-2
       Feel free to visit our “<a href="javascript:document.location.href=document.location.origin+'/contact-us'" title="Click to Contact Us" class="coded_link" ><span class="ui-icon ui-icon-newwin"></span>Contact</a>” link

Memang bekerja untuk saya sedangkan saya tidak bisa menggunakan PHP

Hanya diuji bahwa itu berhasil berkat pendekatan yang disebutkan di atas dalam beberapa jawaban, begitu cepat dan terverifikasi yang berhasil


@Brandito Terima kasih, yah situs itu di-host di host virtual AWS Saya percaya menggunakan wordpress dan tidak tahu mengapa itu memberikan masalah untuk melakukannya dengan cara itu ... Tidak yakin apakah itu pengalihan yang salah atau sesuatu yang harus dilakukan dengan aturan mod menulis ulang backend .. Plus saya ingin menggunakan jquery ui bertema toolip dan ikon bersama dengan itu. Disetujui oleh klien pertama tentu saja: '-)
Jean Paul AKA el_vete
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.