location.host vs location.hostname und browserübergreifende Kompatibilität?

365

Welches davon ist am effektivsten, wenn überprüft wird, ob der Benutzeragent über die richtige Domäne zugreift.

Wir möchten eine kleine js-basierte Warnung im Stil der oberen Leiste anzeigen, wenn sie über eine Art Web-Proxy auf die Domain zugreifen (da dies dazu neigt, die js zu beschädigen).

Wir haben darüber nachgedacht, Folgendes zu verwenden:

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

Das würde sich um alle Subdomains kümmern, die wir jemals benutzen.

Welchen Host oder Hostnamen sollten wir verwenden?

In Firefox 5 und Chrome 12:

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

.. zeigt für beide das gleiche.

Liegt das daran, dass sich der Port nicht in der Adressleiste befindet?

W3Schools sagt, dass der Host den Port enthält.

Sollte location.host/hostname validiert werden oder können wir in IE6 + und allen anderen, die es geben wird, ziemlich sicher sein?

anonym-one
quelle
6
Eine Sache zu beachten ist, dass Google Chrome einen location.origin hat, wo MSIE und Firefox dies nicht tun. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo

Antworten:

1064

interaktive Link-Anatomie

Als kleines Memo: die interaktive Link-Anatomie

- -

Kurz gesagt (unter der Annahme eines Standorts von http://example.org:8888/foo/bar#bang):

  • hostname gibt Ihnen example.org
  • host gibt Ihnen example.org:8888
abernier
quelle
87
Ein Bild sagt mehr als tausend Worte.
Jack Giffin
4
@ lolzerywowzery ... aber nur die tausend Wörter erforderlich, um das Bild zu beschreiben
Agi Hammerthief
1
Laut en.wikipedia.org/wiki/… sollte der Port nicht als Teil des Hosts betrachtet werden (aber er ist Teil der Autorität).
Alec
@Alec das ist ein interessanter technischer Hinweis; Ein Drilldown durch das Wikipedia-Zitat zeigt, dass gemäß RFC 3986 "Autorität" der Begriff für die Verkettung des Hostnamens :und des Ports sein sollte. Ich frage mich, wie viel von der Diskussion noch verfügbar ist, als location.hostsie formuliert wurde ... Ich vermute, dass sie heute so heißt, weil niemand anwesend war oder daran gedacht hat, diesen RFC zu erwähnen.
JamesTheAwesomeDude
Vielen Dank für die einfache Lösung
Tarun Nagpal
70

Der Host enthält nur die Portnummer, falls eine angegeben ist. Wenn die URL keine spezifische Portnummer enthält, wird dieselbe wie der Hostname zurückgegeben. Sie wählen aus, ob Sie mit der Portnummer übereinstimmen möchten oder nicht. Weitere Informationen finden Sie unter https://developer.mozilla.org/en/window.location .

Ich würde annehmen, dass Sie möchten, dass der Hostname nur den Site-Namen erhält.

jfriend00
quelle
33

Wenn Sie darauf bestehen, das zu verwenden, window.location.origin können Sie dies oben in Ihren Code einfügen, bevor Sie das lesenorigin

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

Lösung

PS: Für die Aufzeichnung war es tatsächlich die ursprüngliche Frage. Es wurde bereits bearbeitet :)

Kenneth Palaganas
quelle
5
Aber ... OP nie window.location.originin ihrer Frage erwähnt. Ihre Frage bezog sich tatsächlich speziell auf Dinge, die es nicht sind window.location.origin .
Winderps
1
Es ist auch erwähnenswert, dass window.location.origin Probleme mit der Browserkompatibilität hat. developer.mozilla.org/en-US/docs/Web/API/Window/…
Scott
10

Ihre Hauptfrage wurde oben beantwortet. Ich wollte nur darauf hinweisen, dass der von Ihnen verwendete Regex einen Fehler aufweist. Es wird auch gelingen, auf foo-domain.comdem keine Subdomain von istdomain.com

Was Sie wirklich wollen, ist Folgendes:

/(^|\.)domain\.com$/
Bluesmond
quelle
0

Nur um einen Hinweis hinzuzufügen, dass der Google Chrome-Browser das Ursprungsattribut für den Standort hat. Damit erhalten Sie die gesamte Domain vom Protokoll bis zur Portnummer, wie im folgenden Screenshot gezeigt. Chrome-Entwickler-Tool

Gopi P.
quelle