location.host vs. location.hostname i zgodność między przeglądarkami?

365

Który z nich jest najbardziej skuteczny w porównaniu do sprawdzania, czy agent użytkownika uzyskuje dostęp za pośrednictwem właściwej domeny.

Chcielibyśmy wyświetlać małe ostrzeżenie w stylu „górnego paska” oparte na js, jeśli uzyskują dostęp do domeny przy użyciu jakiegoś proxy sieci web (ponieważ ma to tendencję do łamania js).

Myśleliśmy o zastosowaniu następujących elementów:

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

To zadbałoby o wszystkie poddomeny, których kiedykolwiek używamy.

Którego hosta lub nazwy hosta powinniśmy używać?

W przeglądarce Firefox 5 i Chrome 12:

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

.. pokazuje to samo dla obu.

Czy to dlatego, że portu nie ma w pasku adresu?

W3Schools mówi, że host zawiera port.

Czy lokalizacja.host/nazwa_hosta powinna zostać zweryfikowana, czy możemy być całkiem pewni w IE6 + i wszystkich innych, które będą istnieć?

anonimowy-jeden
źródło
6
Należy zauważyć, że Google Chrome ma lokalizację.origin, w której nie ma MSIE i Firefox. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo

Odpowiedzi:

1063

interaktywna anatomia łącza

Jako mała notatka: interaktywna anatomia łącza

-

W skrócie (zakładając lokalizację http://example.org:8888/foo/bar#bang):

  • hostname daje Ci example.org
  • host daje Ci example.org:8888
abernier
źródło
87
Obraz jest wart tysiąca słów.
Jack Giffin
4
@lolzerywowzery ... ale tylko te tysiące słów potrzebne do opisania obrazu
Agi Hammerthief
1
Według en.wikipedia.org/wiki/… , port nie powinien być uważany za część hosta (ale należy do organu).
Alec
@Alec to interesująca uwaga techniczna; przeglądanie informacji w Wikipedii ujawnia, że zgodnie z RFC 3986 „władza” powinna być terminem połączenia nazwy hosta :i portu. Zastanawiam się, jaka część dyskusji jest wciąż dostępna od czasu, gdy location.hostbyła formułowana ... Podejrzewam, że nazywa się tak dzisiaj, ponieważ nikt z obecnych nie czytał ani nie wspominał o RFC.
JamesTheAwesomeDude,
Bardzo dziękuję za proste rozwiązanie
Tarun Nagpal,
70

host zawiera tylko numer portu, jeśli jest określony. Jeśli w adresie URL nie ma numeru portu, zwraca on taki sam jak nazwa hosta. Ty decydujesz, czy chcesz dopasować numer portu, czy nie. Zobacz https://developer.mozilla.org/en/window.location aby uzyskać więcej informacji.

Zakładam, że chcesz, aby nazwa hosta po prostu otrzymała nazwę witryny.

jfriend00
źródło
33

Jeśli nalegasz na użycie window.location.origin Możesz umieścić to na górze kodu przed przeczytaniemorigin

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

Rozwiązanie

PS: Dla przypomnienia, to było pierwotnie pytanie. To było już edytowane :)

Kenneth Palaganas
źródło
5
Ale .... OP nigdy nie wspomniał window.location.originw swoim pytaniu. Ich pytanie dotyczyło konkretnie rzeczy, które niewindow.location.origin.
Winderps
1
Warto również zauważyć, że window.location.origin ma problemy ze zgodnością przeglądarki. developer.mozilla.org/en-US/docs/Web/API/Window/…
Scott
10

Odpowiedzi na twoje podstawowe pytanie podano powyżej. Chciałem tylko zwrócić uwagę, że regex, którego używasz, zawiera błąd. Uda się również, foo-domain.comco nie jest poddomenądomain.com

To, czego naprawdę chcesz, to:

/(^|\.)domain\.com$/
bluesmoon
źródło
0

Wystarczy dodać notatkę, że przeglądarka Google Chrome ma atrybut pochodzenia dla lokalizacji. co daje całą domenę od protokołu do numeru portu, jak pokazano na poniższym zrzucie ekranu. narzędzie dla programistów chrome

Gopi P.
źródło