location.host vs location.hostname e compatibilidade entre navegadores?


365

Qual delas é a mais eficaz contra a verificação se o agente do usuário está acessando através do domínio correto.

Gostaríamos de mostrar um pequeno aviso de estilo 'barra superior' baseado em js se eles estiverem acessando o domínio usando algum tipo de proxy da Web (pois ele tende a quebrar os js).

Estávamos pensando em usar o seguinte:

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

Isso resolveria todos os subdomínios que usamos.

Qual devemos usar host ou hostname?

No Firefox 5 e Chrome 12:

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

.. mostra o mesmo para ambos.

Isso ocorre porque a porta não está realmente na barra de endereços?

W3Schools diz que o host contém a porta.

Location.host/hostname deve ser validado ou podemos ter certeza no IE6 + e em todos os outros que existirão?


6
Uma coisa a notar é que o google chrome tem um location.origin, onde o MSIE e o Firefox não. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo


Respostas:


1064

anatomia do link interativo

Como um pequeno memorando: a anatomia do link interativo

-

Em suma (assumindo uma localização de http://example.org:8888/foo/bar#bang):

  • hostname da-te example.org
  • host da-te example.org:8888

87
Uma imagem vale mais que mil palavras.
Jack Giffin

4
@lolzerywowzery ... mas apenas os mil palavras necessárias para descrever a imagem
Agi Hammerthief

11
De acordo com en.wikipedia.org/wiki/… , a porta não deve ser considerada parte do host (mas é parte da autoridade).
Alec

@ Alec, esta é uma nota técnica interessante; detalhando a citação da Wikipedia, revela que, de acordo com a RFC 3986, "autoridade" deve ser o termo para concatenação do nome do host :e da porta. Gostaria de saber quanto da discussão ainda está disponível a partir de quando location.hostestava sendo formulada ... Suspeito que seja chamada hoje porque ninguém presente havia lido ou pensado em mencionar essa RFC.
JamesTheAwesomeDude 02/12/19

Muito obrigado pela solução simples
Tarun Nagpal

70

host inclui apenas o número da porta, se houver um especificado. Se não houver um número de porta especificamente no URL, ele retornará o mesmo que o nome do host. Você escolhe se deseja corresponder ao número da porta ou não. Veja https://developer.mozilla.org/en/window.location para mais informações.

Eu diria que você deseja que o nome do host obtenha apenas o nome do site.


33

Se você está insistindo em usar o botão window.location.origin Você pode colocar isso no topo do seu código antes de ler oorigin

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

Solução

PS: Para constar, era realmente a pergunta original. Já foi editado :)


5
Mas .... OP nunca mencionado window.location.originem sua pergunta. A pergunta deles era realmente específica sobre coisas que não são window.location.origin.
Winderps

11
Também é importante observar que o window.location.origin tem problemas de compatibilidade do navegador. developer.mozilla.org/pt-BR/docs/Web/API/Window/…
Scott #:

10

Sua pergunta principal foi respondida acima. Eu só queria salientar que o regex que você está usando tem um erro. Ele também terá sucesso no foo-domain.comqual não é um subdomínio dedomain.com

O que você realmente quer é isso:

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


0

Apenas para adicionar uma observação de que o navegador Google Chrome possui atributo de origem para o local. que fornece todo o domínio, do protocolo ao número da porta, conforme mostrado na captura de tela abaixo. ferramenta de desenvolvedores do chrome

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.