location.host vs location.hostname та сумісність між браузерами?


365

Який із них є найефективнішим порівняно з перевіркою того, чи доступ до агента користувача здійснюється через правильний домен.

Ми хотіли б показати невелике попередження в стилі "верхній бар" на js, якщо вони звертаються до домену за допомогою якогось веб-проксі (оскільки це правило, щоб зламати 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 chrome є location.origin, де MSIE та Firefox цього не роблять. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo

Дивіться також:
Яка

Відповіді:


1063

анатомія інтерактивної ланки

Як невеличке нагадування: анатомія інтерактивного зв’язку

-

Якщо коротко (якщо припустити місце розташування http://example.org:8888/foo/bar#bang):

  • hostname дає тобі example.org
  • host дає тобі example.org:8888

87
Малюнок вартує тисячі слів.
Джек Гіффін

4
@lolzerywowzery ... але для опису картини потрібно лише ті тисячі слів
Agi Hammerthief

1
Згідно з en.wikipedia.org/wiki/… , порт не повинен вважатися частиною хоста (але він є частиною повноважень).
Алек

@Alec це цікава технічна записка; Звернення до цитування Вікіпедії показує, що, згідно з RFC 3986, "авторитет" повинен бути терміном для об'єднання імені хоста :і порту. Цікаво, яка частина дискусій ще доступна з тих пір, коли location.hostїї формулювали ... Я підозрюю, що вона названа сьогодні такою, оскільки ніхто з присутніх не читав і не думав згадувати про це RFC.
JamesTheAwesomeDude

Дякую вам за просте рішення
Тарун Нагпал

70

хост просто включає номер порту, якщо він вказаний. Якщо номер порту конкретно в URL-адресі немає, він повертає те саме, що і ім’я хоста. Вибираєте, чи хочете ви відповідати номеру порту чи ні. Для отримання додаткової інформації див. Https://developer.mozilla.org/uk/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 .
Winderps

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

10

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

Те, що вам справді хочеться, це:

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


0

Просто додати зауваження, що у веб-переглядача Google Chrome є атрибут походження для місцезнаходження. який дає вам весь домен від протоколу до номера порту, як показано на скріншоті нижче. інструмент для розробників хрому

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.