location.host vs location.hostname и кросс-браузерная совместимость?


366

Какой из них является наиболее эффективным по сравнению с проверкой, осуществляет ли пользовательский агент доступ через правильный домен.

Мы хотели бы показать маленькое предупреждение на основе js в стиле 'top bar', если они получают доступ к домену через какой-то веб-прокси (так как он имеет тенденцию нарушать js).

Мы думали об использовании следующего:

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

Это позаботится о любых поддоменах, которые мы когда-либо используем.

Какой нам следует использовать хост или имя хоста?

В Firefox 5 и Chrome 12:

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

.. показывает то же самое для обоих.

Это потому, что порт на самом деле не находится в адресной строке?

W3Schools говорит, что хост содержит порт.

Следует ли проверять location.host/hostname или мы можем быть уверены в IE6 + и во всех остальных, он будет существовать?


6
Стоит отметить, что в Google Chrome есть location.origin, чего нет у MSIE и Firefox. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo


Ответы:


1065

интерактивная ссылка анатомия

В качестве небольшой заметки: анатомия интерактивной ссылки

-

Вкратце (при условии местоположения http://example.org:8888/foo/bar#bang):

  • hostname дает тебе example.org
  • host дает тебе example.org:8888

88
Одна картинка стоит тысячи слов.
Джек Гиффин

4
@lolzerywowzery ... но только те тысячи слов, которые необходимы для описания картины
Agi Hammerthief

1
Согласно en.wikipedia.org/wiki/… , порт не должен рассматриваться как часть хоста (но это часть авторитета).
Алек

@ Алек это интересная техническая заметка; Развертывание через цитату из Википедии показывает, что, согласно RFC 3986, «авторитет» должен быть термином для объединения имени хоста :и порта. Интересно, сколько обсуждения еще доступно с момента location.hostего формулирования ... Я подозреваю, что сегодня оно названо так, потому что никто из присутствующих не читал и не думал упомянуть этот RFC.
JamesTheAwesomeDude

Большое спасибо за простое решение
Тарун

70

хост просто включает номер порта, если он указан. Если в URL нет номера порта, он возвращает то же самое, что и имя хоста. Вы выбираете, хотите ли вы соответствовать номеру порта или нет. См. Https://developer.mozilla.org/en/window.location для получения дополнительной информации.

Я предполагаю, что вы хотите, чтобы имя хоста просто получало имя сайта.


33

Если вы настаиваете на использовании window.location.origin Вы можете поместить это в верхней части вашего кода, прежде чем читатьorigin

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

Решение

PS: для протокола, это был фактически оригинальный вопрос. Это было уже отредактировано :)


5
Но .... ОП никогда не упоминал window.location.originв своем вопросе. На самом деле их вопрос касался вещей, которых нет window.location.origin .
Уиндерпс

1
Также стоит отметить, что у window.location.origin есть проблемы совместимости браузера. developer.mozilla.org/en-US/docs/Web/API/Window/…
Скотт

10

Ваш основной вопрос был дан ответ выше. Я просто хотел указать, что у используемого вами регулярного выражения есть ошибка. Это также будет успешным, foo-domain.comчто не является поддоменомdomain.com

То, что вы действительно хотите, это:

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


0

Просто добавьте примечание, что браузер Google Chrome имеет атрибут источника для местоположения. который дает вам весь домен от протокола до номера порта, как показано на скриншоте ниже. инструмент для разработчиков Chrome

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.