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
abernier
источник
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 для получения дополнительной информации.

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

jfriend00
источник
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$/
bluesmoon
источник
0

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

Гопи П
источник