location.host vs location.hostname và tương thích trình duyệt chéo?


365

Cái nào trong số này là hiệu quả nhất so với việc kiểm tra xem tác nhân người dùng có truy cập thông qua tên miền chính xác hay không.

Chúng tôi muốn hiển thị cảnh báo kiểu 'thanh trên cùng' của js nhỏ nếu họ đang truy cập tên miền bằng một số loại web proxy (vì nó có xu hướng phá vỡ js).

Chúng tôi đã suy nghĩ về việc sử dụng như sau:

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

Điều đó sẽ chăm sóc bất kỳ tên miền phụ chúng tôi từng sử dụng.

Chúng ta nên sử dụng máy chủ hoặc tên máy chủ?

Trong Firefox 5 và Chrome 12:

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

.. hiển thị giống nhau cho cả hai.

Có phải vì cổng không thực sự nằm trong thanh địa chỉ?

W3Schools nói rằng máy chủ chứa cổng.

Nên xác thực location.host/hostname hoặc chúng ta có thể khá chắc chắn trong IE6 + và tất cả những cái khác nó sẽ tồn tại?


6
Một điều cần lưu ý là google chrome có location.origin, nơi MSIE và Firefox không có. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/l
Library / ms952653.aspx


Câu trả lời:


1064

giải phẫu liên kết tương tác

Như một bản ghi nhớ nhỏ: giải phẫu liên kết tương tác

-

Tóm lại (giả sử một vị trí của http://example.org:8888/foo/bar#bang):

  • hostname mang đến cho bạn example.org
  • host mang đến cho bạn example.org:8888

87
Một bưc tranh đang gia ngan lơi noi.
Jack Giffin

4
@lolzerywowzery ... nhưng chỉ cần một ngàn từ cần thiết để mô tả bức tranh
Agi Hammerthief

1
Theo en.wikipedia.org/wiki/ Nhật , cổng không nên được coi là một phần của máy chủ (nhưng nó là một phần của chính quyền).
Alec

@Alec đây là một lưu ý kỹ thuật thú vị; đi sâu vào trích dẫn Wikipedia cho thấy, theo RFC 3986, "chính quyền" phải là thuật ngữ để ghép tên máy chủ :và cổng. Tôi tự hỏi bao nhiêu cuộc thảo luận vẫn có sẵn từ khi location.hostđược xây dựng ... Tôi nghi ngờ ngày hôm nay nó được đặt tên như vậy bởi vì không ai có mặt đã đọc hoặc nghĩ rằng đề cập đến RFC.
JamesTheAwgieDude

Cảm ơn bạn rất nhiều vì giải pháp đơn giản
Tarun Nagpal

70

máy chủ chỉ bao gồm số cổng nếu có một chỉ định. Nếu không có số cổng cụ thể trong URL, thì nó sẽ trả về giống như tên máy chủ. Bạn chọn xem bạn quan tâm để phù hợp với số cổng hay không. Xem https://developer.mozilla.org/en/window.location để biết thêm thông tin.

Tôi sẽ giả sử bạn muốn tên máy chủ chỉ nhận được tên trang web.


33

Nếu bạn khăng khăng sử dụng window.location.origin Bạn có thể đặt mã này lên trên mã của mình trước khi đọcorigin

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

Giải pháp

PS: Đối với hồ sơ, nó thực sự là câu hỏi ban đầu. Nó đã được chỉnh sửa :)


5
Nhưng .... OP không bao giờ đề cập đến window.location.origintrong câu hỏi của họ. Câu hỏi của họ thực sự đặc biệt liên quan đến những điều không window.location.origin .
Winderps

1
Cũng đáng lưu ý rằng window.location.origin có vấn đề tương thích trình duyệt. developer.mozilla.org/en-US/docs/Web/API/Window/
mẹo

10

Câu hỏi chính của bạn đã được trả lời ở trên. Tôi chỉ muốn chỉ ra rằng regex bạn đang sử dụng có lỗi. Nó cũng sẽ thành công foo-domain.commà không phải là tên miền phụ củadomain.com

Những gì bạn thực sự muốn là đây:

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


0

Chỉ cần thêm một lưu ý rằng trình duyệt Google Chrome có thuộc tính gốc cho vị trí. cung cấp cho bạn toàn bộ miền từ giao thức đến số cổng như trong ảnh chụp màn hình bên dưới. công cụ phát triển chrome

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.