location.host vs location.hostname et compatibilité entre les navigateurs?


366

Lequel d'entre eux est le plus efficace par rapport à la vérification si l'agent utilisateur accède via le domaine correct.

Nous aimerions afficher un petit avertissement de style "barre supérieure" basé sur js s'ils accèdent au domaine en utilisant une sorte de proxy Web (car cela a tendance à casser les js).

Nous pensions utiliser les éléments suivants:

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

Cela prendrait en charge tous les sous-domaines que nous utilisons.

Lequel devrions-nous utiliser host ou hostname?

Dans Firefox 5 et Chrome 12:

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

.. montre la même chose pour les deux.

Est-ce parce que le port n'est pas réellement dans la barre d'adresse?

W3Schools dit que l'hôte contient le port.

Faut-il valider location.host/hostname ou pouvons-nous être à peu près certains dans IE6 + et tous les autres, il existera?


6
Une chose à noter est que Google Chrome a un emplacement.origin, où MSIE et Firefox n'ont pas. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo


Réponses:


1065

anatomie du lien interactif

Petit mémo: l' anatomie du lien interactif

-

En bref (en supposant un emplacement de http://example.org:8888/foo/bar#bang):

  • hostname vous donne example.org
  • host vous donne example.org:8888

88
Une image vaut mieux que mille mots.
Jack Giffin

4
@lolzerywowzery ... mais seulement ces mille mots nécessaires pour décrire l'image
Agi Hammerthief

1
Selon en.wikipedia.org/wiki/… , le port ne doit pas être considéré comme faisant partie de l'hôte (mais il fait partie de l'autorité).
Alec

@Alec c'est une note technique intéressante; un examen approfondi à travers la citation de Wikipédia révèle que, selon la RFC 3986, «autorité» devrait être le terme utilisé pour la concaténation du nom d'hôte :et du port. Je me demande dans quelle mesure la discussion est encore disponible depuis le moment où elle location.hosta été formulée ... Je soupçonne qu'elle porte ce nom aujourd'hui car personne n'a lu ou pensé à mentionner ce RFC.
JamesTheAwesomeDude

Merci beaucoup pour la solution simple
Tarun Nagpal

70

l'hôte inclut simplement le numéro de port s'il en est spécifié un. S'il n'y a pas de numéro de port spécifiquement dans l'URL, il renvoie le même que le nom d'hôte. Vous choisissez si vous souhaitez faire correspondre le numéro de port ou non. Voir https://developer.mozilla.org/en/window.location pour plus d'informations.

Je suppose que vous voulez que le nom d'hôte obtienne simplement le nom du site.


33

Si vous insistez pour utiliser le window.location.origin Vous pouvez mettre ceci en haut de votre code avant de lire leorigin

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

Solution

PS: Pour mémoire, c'était en fait la question d'origine. Il a déjà été édité :)


5
Mais .... OP n'a jamais mentionné window.location.origindans leur question. En fait, leur question concernait spécifiquement les choses qui ne le sont paswindow.location.origin .
Winderps

1
Il convient également de noter que window.location.origin présente des problèmes de compatibilité avec le navigateur. developer.mozilla.org/en-US/docs/Web/API/Window/…
Scott

10

Votre question principale a été répondue ci-dessus. Je voulais juste souligner que l'expression régulière que vous utilisez a un bug. Il réussira également sur foo-domain.comlequel n'est pas un sous-domaine dedomain.com

Ce que vous voulez vraiment, c'est ceci:

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


0

Juste pour ajouter une note que le navigateur Google Chrome a un attribut d'origine pour l'emplacement. qui vous donne le domaine entier du protocole au numéro de port comme indiqué dans la capture d'écran ci-dessous. outil pour développeurs Chrome

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.