Obter protocolo, domínio e porta do URL

301

Preciso extrair o protocolo, o domínio e a porta completos de um determinado URL. Por exemplo:

https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer
>>>
https://localhost:8181
yelo3
fonte
9
Para aqueles leitores que procuram uma resposta onde o URL não é o local atual, olhada abaixo a resposta aceita
Guy Schalnat

Respostas:

150

primeiro obtenha o endereço atual

var url = window.location.href

Então basta analisar essa string

var arr = url.split("/");

seu URL é:

var result = arr[0] + "//" + arr[2]

Espero que isto ajude

wezzy
fonte
8
Isso funciona com seqüência de URL, onde locationobjeto não está disponível (JS navegador fora!)
Thamme Gowda
A resposta de David Calhoun usa o analisador interno (como location), mas pode ser usado para qualquer URL. Confira, é legal.
Stijn de Witt
6
Ou apenas transformá-lo em uma frase:window.location.href.split('/').slice(0, 3).join('/')
Ryan McGeary 16/05
e como você faria isso no nó?
DDD
5
window.location.origin
int soumen 30/11
576
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
Shef
fonte
3
@Randomblue What about it? Você receberá about://. No entanto, estou curioso para saber, qual seria o caso de uso about:blank? Não tenho certeza se algum navegador injeta recursos de plug-in about:blank, mas parece que esse pode ser o único caso de uso.
Shef
3
Isso não funciona se você tiver uma string de URL, certo? (ou seja, você precisa estar em location para este ao trabalho)
Nick T
1
Desculpe pela resposta tardia, @NickT. Sim, não faz isso. Por favor, use a boa solução fornecida por David para isso.
Shef
1
Esta resposta deve ser escolhida como a resposta correta. É limpo e usa o objeto de localização padrão.
Mohit Gangrade
14
Você não pode usar em location.hostvez de location.hostname+ location.port?
C24w
180

Nenhuma dessas respostas parece abordar completamente a pergunta, que exige um URL arbitrário, não especificamente o URL da página atual.

Método 1: usar a API da URL (ressalva: sem suporte ao IE11)

Você pode usar a API da URL (não suportada pelo IE11, mas disponível em qualquer outro lugar ).

Isso também facilita o acesso aos parâmetros de pesquisa . Outro bônus: pode ser usado em um Web Worker, pois não depende do DOM.

const url = new URL('http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

Método 2 (maneira antiga): use o analisador interno do navegador no DOM

Use isso se você precisar que ele funcione em navegadores antigos também.

//  Create an anchor element (note: no need to append this element to the document)
const url = document.createElement('a');
//  Set href to any path
url.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');

É isso aí!

O analisador interno do navegador já fez seu trabalho. Agora você pode simplesmente pegar as partes necessárias (observe que isso funciona para os dois métodos acima):

//  Get any piece of the url you're interested in
url.hostname;  //  'example.com'
url.port;      //  12345
url.search;    //  '?startIndex=1&pageSize=10'
url.pathname;  //  '/blog/foo/bar'
url.protocol;  //  'http:'

Bônus: pesquisar parâmetros

É provável que você também queira separar os parâmetros dos URLs de pesquisa, já que '? StartIndex = 1 & pageSize = 10' não é muito utilizável por si só.

Se você usou o Método 1 (URL API) acima, basta usar os getters searchParams:

url.searchParams.get('startIndex');  // '1'

Ou para obter todos os parâmetros:

function searchParamsToObj(searchParams) {
  const paramsMap = Array
    .from(url.searchParams)
    .reduce((params, [key, val]) => params.set(key, val), new Map());
  return Object.fromEntries(paramsMap);
}
searchParamsToObj(url.searchParams);
// -> { startIndex: '1', pageSize: '10' }

Se você usou o Método 2 (da maneira antiga), pode usar algo como isto:

// Simple object output (note: does NOT preserve duplicate keys).
var params = url.search.substr(1); // remove '?' prefix
params
    .split('&')
    .reduce((accum, keyval) => {
        const [key, val] = keyval.split('=');
        accum[key] = val;
        return accum;
    }, {});
// -> { startIndex: '1', pageSize: '10' }
David Calhoun
fonte
link.protocol recebe um "http:" se eu inspecionar um anker com "google.com" :-(var link = document.createElement('a'); link.setAttribute('href', 'google.com'); console.log(link.protocol)
eXe
Você está fazendo isso em uma httppágina, talvez? Se não for especificado ele vai 'herdar' a partir da localização atual
Stijn de Witt
4
Essa é uma resposta fantástica e deve receber mais votos, porque essa resposta não se limita apenas ao local atual , mas funciona para qualquer URL , e porque essa resposta utiliza o analisador interno do navegador em vez de criar um nós mesmos (o que não podemos espero fazer tão bem ou tão rápido!).
Stijn de Witt
Obrigado por este truque inteligente! Gostaria de acrescentar uma coisa: existem ambos hoste hostname. O primeiro inclui a porta (por exemplo localhost:3000), enquanto o último é apenas o nome do host (por exemplo localhost).
Codificador 31/03
Isso funciona bem em caso de URL absoluto. Falha no caso de URL relativo e entre navegadores. Alguma sugestão?
Gururaj
133

Por alguma razão, todas as respostas são todas exageradas. É tudo o que é preciso:

window.location.origin

Mais detalhes podem ser encontrados aqui: https://developer.mozilla.org/en-US/docs/Web/API/window.location#Properties

Pijusn
fonte
19
FYI, eu tenho certeza que isso vai ser grande no futuro, quando todos os navegadores populares implementaram-lo, no entanto , este não é o caso no momento: developer.mozilla.org/en-US/docs/Web/API/... No No momento em que escrevi, apenas as versões recentes dos navegadores Firefox e WebKit suportam a propriedade origin de acordo com minha pesquisa.
Zac Seth
2
Apenas para concluir: o local é definido no HTML5 e implementa a URLUtilsinterface definida no WHATWG e inclui o originatributo
Ciro Santilli escreveu
5
Olá a partir de 2015 .. infelizmente o URLUtils ainda não foi implementado corretamente em todos os navegadores, de acordo com esta tabela de compatibilidade no MDN. No entanto, parece que a propriedade de origem é um pouco melhor suportada do que em 2013, ainda não é adequada para produção , pois não foi implementada corretamente no Safari. Desculpe pessoal :(
totallyNotLizards
Atualização: Ainda não há suporte para muitos navegadores (também safari) :( :(
Ahmad hamza
Também não funciona no IE, retorna "indefinido".
Siddhartha Chowdhury
53

Como já foi mencionado, existe ainda o suporte total window.location.origin mas, em vez de usá-lo ou criar uma nova variável para uso, prefiro procurá-lo e se não estiver definido para configurá-lo.

Por exemplo;

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

Na verdade, eu escrevi sobre isso há alguns meses. Uma correção para window.location.origin

Toby
fonte
1
É a primeira vez que sei que window.location.originexiste. Obrigado. ^^
EThaizone Jo 8/17
33

hospedeiro

var url = window.location.host;

retorna localhost:2679

nome de anfitrião

var url = window.location.hostname;

retorna localhost

Miroslav Holec
fonte
Obrigado!!! Eu não conseguia descobrir por que localhost estava aparecendo como em localhost/vez de localhost:3000.
Tyler Youngblood #
23

window.location.origin será suficiente para obter o mesmo.

int soumen
fonte
1
Isso resolveu meu problema facilmente. Obrigado @intsoumen
Turker Tunali
14

A propriedade protocol define ou retorna o protocolo da URL atual, incluindo os dois pontos (:).

Isso significa que se você deseja obter apenas a parte HTTP / HTTPS, pode fazer algo assim:

var protocol = window.location.protocol.replace(/:/g,'')

Para o domínio você pode usar:

var domain = window.location.hostname;

Para a porta você pode usar:

var port = window.location.port;

Lembre-se de que a porta será uma cadeia vazia se não estiver visível no URL. Por exemplo:

Se você precisar mostrar 80/443 quando não tiver porta, use

var port = window.location.port || (protocol === 'https' ? '443' : '80');
Дамян Станчев
fonte
9

Por que não usar:

let full = window.location.origin
Maik de Kruif
fonte
3
Ao adicionar uma resposta a uma pergunta mais antiga com as respostas existentes, é útil explicar que novas informações sua resposta traz e reconhecer se a passagem do tempo afeta a resposta.
21719 Jason Aller
8

De fato, window.location.origin funciona bem em navegadores seguindo padrões, mas adivinhem. O IE não está seguindo os padrões.

Então, por isso, foi o que funcionou para mim no IE, FireFox e Chrome:

var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');

mas, para possíveis aprimoramentos futuros que possam causar conflitos, especifiquei a referência "window" antes do objeto "location".

var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');
CPU
fonte
6

Aqui está a solução que estou usando:

const result = `${ window.location.protocol }//${ window.location.host }`;

EDITAR:

Para adicionar compatibilidade entre navegadores, use o seguinte:

const result = `${ window.location.protocol }//${ window.location.hostname + (window.location.port ? ':' + window.location.port: '') }`;
JulienRioux
fonte
1
Upvoted, mas window.location.hostpode não ser o melhor cross-browser
nathanfranke
1
Obrigado, adicionei compatibilidade entre navegadores à minha resposta original.
precisa saber é
3
var http = location.protocol;
var slashes = http.concat("//");
var host = slashes.concat(window.location.hostname);
Elankeeran
fonte
3
var getBasePath = function(url) {
    var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i);
    return r ? r[0] : '';
};
haipeng
fonte
2
considere explicar sua resposta. Não presuma que o OP possa entender o significado das diferentes partes do seu código.
ADyson 9/09/16
3

Tente usar uma expressão regular (Regex), que será bastante útil quando você deseja validar / extrair itens ou até mesmo fazer uma análise simples em javascript.

O regex é:

/([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/

Demonstração:

function breakURL(url){

     matches = /([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/.exec(url);

     foo = new Array();

     if(matches){
          for( i = 1; i < matches.length ; i++){ foo.push(matches[i]); }
     }

     return foo
}

url = "https://www.google.co.uk:55699/search?q=http%3A%2F%2F&oq=http%3A%2F%2F&aqs=chrome..69i57j69i60l3j69i65l2.2342j0j4&sourceid=chrome&ie=UTF-8"


breakURL(url);       // [https, www.google.co.uk, 55699] 
breakURL();          // []
breakURL("asf");     // []
breakURL("asd://");  // []
breakURL("asd://a"); // [asd, a, undefined]

Agora você pode fazer a validação também.

ed9w2in6
fonte
"Um esquema de URL RFC 3986 válido deve consistir em" uma letra e seguido por qualquer combinação de letras, dígitos, mais ("+"), ponto final (".") Ou hífen ("-"). "- stackoverflow. com / a / 9142331/188833 (Aqui está uma urna: ietf: rfc: 3897 (URI) / urn: ietf: rfc: 3897 (IRI) para o esquema: parte de um URI / IRI em Python: github.com/dgerber /rfc3987/blob/master/rfc3987.py#L147 )
Wes Turner
2

Resposta simples que funciona para todos os navegadores:

let origin;

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

origin = window.location.origin;
Mike Hawes
fonte
1

Estilo ES6 com parâmetros configuráveis.

/**
 * Get the current URL from `window` context object.
 * Will return the fully qualified URL if neccessary:
 *   getCurrentBaseURL(true, false) // `http://localhost/` - `https://localhost:3000/`
 *   getCurrentBaseURL(true, true) // `http://www.example.com` - `https://www.example.com:8080`
 *   getCurrentBaseURL(false, true) // `www.example.com` - `localhost:3000`
 *
 * @param {boolean} [includeProtocol=true]
 * @param {boolean} [removeTrailingSlash=false]
 * @returns {string} The current base URL.
 */
export const getCurrentBaseURL = (includeProtocol = true, removeTrailingSlash = false) => {
  if (!window || !window.location || !window.location.hostname || !window.location.protocol) {
    console.error(
      `The getCurrentBaseURL function must be called from a context in which window object exists. Yet, window is ${window}`,
      [window, window.location, window.location.hostname, window.location.protocol],
    )
    throw new TypeError('Whole or part of window is not defined.')
  }

  const URL = `${includeProtocol ? `${window.location.protocol}//` : ''}${window.location.hostname}${
    window.location.port ? `:${window.location.port}` : ''
  }${removeTrailingSlash ? '' : '/'}`

  // console.log(`The URL is ${URL}`)

  return URL
}
Sébastien
fonte
0

window.location.protocol + '//' + window.location.host

Code_Worm
fonte