Nhận tên miền hiện tại bằng Javascript (Không phải đường dẫn, v.v.)


245

Tôi dự định mua hai tên miền cho cùng một trang. Tùy thuộc vào tên miền nào được sử dụng, tôi dự định cung cấp dữ liệu hơi khác nhau trên trang. Có cách nào để tôi phát hiện tên miền thực mà trang đang tải từ đó để tôi biết phải thay đổi nội dung của mình thành gì không?

Tôi đã tìm kiếm những thứ như thế này nhưng hầu hết nó không hoạt động theo cách tôi muốn.

Ví dụ khi sử dụng

document.write(document.location)

trên JSFiddle, nó trả về

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

tức là đường dẫn thực tế hay bất cứ thứ gì


1
Tôi không chắc liệu tôi có hiểu chính xác những gì bạn muốn làm hay không, nhưng có lẽ bạn nên xem MDN về vấn đề này
MilkyWayJoe

Một chút chủ đề, nhưng bạn cũng có thể xem xét việc có các tên miền phụ thay vì hai tên miền riêng biệt. Một cái gì đó giống như premium.random.comfree.random.com
T.Chmelevskij

Câu trả lời:


454

Làm thế nào về:

window.location.hostname

Đối locationtượng thực sự có một số thuộc tính đề cập đến các phần khác nhau của URL


55
window.location.hostnamenếu bạn không muốn nhận port(như http://localhost:3000/, window.location.host = 'localhost:3000'window.location.hostname = 'localhost'
Guilherme

6
Câu trả lời là sai vì cổng không thuộc về miền. Và window.location.hostđôi khi sẽ trả lại cổng.
Andrej

4
Điều này cũng trả về tên máy chủ ('www.amazedjokes.com', thay vì chỉ '.amazedjokes.com')
patrick

Trong trường hợp bạn có DNS chuyển tiếp, bạn có thể cần cái này - window.location.ancestorOrigins
Kirill Gusyatin

123

Hãy thử chạy trong script: path: http: // localhost: 4200 / hạ cánh? Query = 1 # 2

console.log(window.location.hash)

Vị trí có các giá trị sau:

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
Đây là một câu trả lời tuyệt vời!
Andrew Campbell

2
Tôi thích câu trả lời với một số ví dụ. Cảm ơn bạn rât nhiêu.
Magno Alberto

24

Nếu bạn không quan tâm đến tên máy chủ (ví dụ www.beta.example.com) nhưng trong tên miền (ví dụ example.com), thì tên này hoạt động với tên máy chủ hợp lệ:

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

13
Không chính xác, điều này sẽ phá vỡ trên gần như tất cả các TLD quốc tế.
tbranyen

4
@tbranyen bạn có thể giải thích những gì bạn đang đề cập đến? Trường hợp duy nhất tôi có thể nghĩ là tên miền phụ như thế nào amazon.co.uk. Nhưng chắc chắn không phải là "gần như tất cả các TLD quốc tế". Trên thực tế, nó hoạt động với 100% mã quốc gia được tìm thấy trong Wikipedia
cprcrack

1
cprcrack vì một số lý do tôi nghĩ rằng các tlds quốc tế (sang Mỹ) có nhiều dấu chấm. Cảm ơn đã sửa!
tbranyen

Một số quốc gia hoạt động tương tự như Vương quốc Anh: họ có các tên miền cấp hai cố định và bạn chỉ có thể đăng ký tên miền ở cấp độ thứ ba. Một danh sách các quốc gia có trên 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;
}

Ví dụ

Phiên bản trước đã nhận được tên miền đầy đủ (bao gồm cả tên miền phụ). Bây giờ nó xác định đúng tên miền tùy theo sở thích. Vì vậy, khi đối số thứ 2 được cung cấp là đúng, nó sẽ bao gồm tên miền phụ, nếu không, nó chỉ trả về 'tên miền chính'


1
Đây phải là câu trả lời, nó hoạt động ngay cả trong localhost/test.phpvà đó là câu trả lời chính xác localhost.
Mohammad AlBanna

Đây cũng là câu trả lời tốt nhất vì nó hoạt động với bất kỳ URL nào bạn truy cập, không chỉ cửa sổ hiện tại
Vị trí

Nếu bạn làm điều này để google.co.ukbạn sẽ nhận lại 'co.uk', điều đó không đúng ...
James Douglas

Đúng. Đó là một công việc khó khăn. Thậm chí phức tạp hơn nếu bạn cũng có tên miền phụ (như: test.google.co.uk). Nếu bạn muốn sử dụng phiên bản thô này, một số điều chỉnh nghiêm túc là cần thiết (thậm chí có thể thêm một danh sách đặc biệt cho các tlds đó).
adelineu

10

Bạn có thể lấy nó từ đối tượng vị trí trong Javascript một cách dễ dàng:

Ví dụ: URL của trang này là:

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

Sau đó, chúng ta có thể nhận được tên miền chính xác với các thuộc tính sau của đối tượng vị trí:

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

bạn có thể tạo tên miền đầy đủ với:

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

Mà trong ví dụ này trả về http://www.stackoverflow.com

Tôi thêm vào điều này, chúng ta có thể nhận được URL đầy đủ và cả đường dẫn với các thuộc tính khác của đối tượng vị trí:

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

Nếu bạn chỉ quan tâm đến tên miền và muốn bỏ qua tên miền phụ thì bạn cần phải phân tích nó ra hosthostname.

Các mã sau đây thực hiện điều này:

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/


Tại sao nó trả về jShell thay vì jsFiddle?
Freesnöw

2
@XanderLamkins: iframe của nó: jsfiddle.net/5U366 <-> fiddle.jshell.net/5U366/show
Saxoier

7

Vì câu hỏi này yêu cầu tên miền, không phải tên máy chủ, nên một câu trả lời đúng

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

Điều này cũng hoạt động cho tên máy chủ như www.example.com .


1
Điều này hoạt động nhưng không hoạt động với các tên miền như domain.co.uk, domain.com.br .. Làm cách nào tôi có thể làm cho nó hoạt động với bất kỳ tên miền nào?
Sameh

6

Sử dụng

document.write(document.location.hostname)​

window.locationcó một loạt các tài sản. Xem ở đây để xem danh sách của họ.


5

Nếu bạn muốn có một nguồn gốc tên miền đầy đủ, bạn có thể sử dụng điều này:

document.location.origin

Và nếu bạn chỉ muốn lấy tên miền, hãy sử dụng bạn có thể chỉ thế này:

document.location.hostname

Nhưng bạn có các tùy chọn khác, hãy xem các thuộc tính trong:

document.location

5

Còn chức năng này thì sao?

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

Điều này sẽ chỉ khớp với tên miền bất kể tên miền phụ hay tên miền chính


1
Tôi thích câu trả lời này. Nhưng bạn nên lưu ý rằng nếu sử dụng nó cho các mục đích liên quan đến bảo mật .. nó có thể được bỏ qua. Tức là nếu bạn muốn đảm bảo bạn đang ở trên example.com, thì hacker-example.com cũng sẽ bằng 'example.com'. window.location.hostname.match (/ [a-zA-Z0-9 -] * \. [a-zA-Z0-9 -] * $ /) [0] hoạt động.
hiburn8

4

Nếu bạn muốn lấy tên miền bằng JavaScript, chỉ cần sử dụng mã sau:

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

Nếu bạn cần đường dẫn URL của trang web để bạn có thể truy cập đường dẫn URL web, hãy sử dụng ví dụ này:

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

2

đối với trường hợp của tôi, kết quả phù hợp nhất là window.location.origin


1

Tôi mới sử dụng JavaScript, nhưng bạn không thể sử dụng: document.domain ?

Thí dụ:

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

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

Đầu ra:

domain.com

hoặc là

www.domain.com

Tùy thuộc vào những gì bạn sử dụng trên trang web của bạn.


0

Tôi nghĩ nó nên đơn giản như thế này:

url.split("/")[2]


Làm việc cho tôi. Các giải pháp trước đó dựa trên tài liệu, vị trí hoặc đối tượng cửa sổ.
Cris

0

Kết hợp một vài câu trả lời ở trên, những điều sau đây thực sự tốt cho tôi khi phá hủy 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]}`;
  }

Hoạt động cho các địa chỉ IP có cổng, ví dụ: 0,0.0.0:8000, v.v., cũng như các tên miền phức tạp như app.staging.example.comreturn .example.com=> cho phép thiết lập và hủy cài đặt Cookie tên miền chéo.


0

Nếu bạn muốn tên miền quốc gia - ví dụ để trích xuất  .com   từ 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;
}

Sau đó, chỉ cần sử dụng hàm để gán giá trị cho 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

Quả thực làm việc cho tôi trong khi tôi không thể sử dụng PHP

Chỉ cần kiểm tra rằng nó hoạt động nhờ vào cách tiếp cận được đề cập ở trên trong một số câu trả lời, vì vậy nhanh chóng và được xác minh rằng đã hoạt động


@Brandito Cảm ơn, trang web đó đã được lưu trữ trong máy chủ ảo AWS Tôi tin rằng sử dụng wordpress và không biết tại sao nó lại gây ra vấn đề khi làm theo cách đó ... Không chắc là nó đã chuyển hướng sai hay phải làm gì đó. với các quy tắc viết lại mod phụ trợ .. Thêm vào đó tôi muốn sử dụng một biểu tượng và biểu tượng theo chủ đề jquery ui cùng với nó. Tất nhiên được khách hàng chấp thuận trước tiên: '-)
Jean Paul AKA el_vete
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.