Vyhledávání na webu

javascript Jak zjistit, zda má URL stejný původ jako aktuální stránka?


Jak mohu zkontrolovat, zda konkrétní řetězec URL pochází ze stejného původu/hostitele jako aktuální stránka? Například, pokud bych chtěl připojit se k odkazům, ale chtěl bych zabránit výchozímu chování jen u odkazů na stejný hostitel...

Odpověď č. 1

To by mělo být dnes bezpečné používat:

function sameOrigin(a, b) {
    const urlA = new URL(a);
    const urlB = new URL(b);
    return urlA.origin === urlB.origin;
}

console.log(sameOrigin('https://stacksnippets.net', window.location))

Odpověď č. 2

Definice Originu z RFC 6454:

Zhruba řečeno, dvě URI patří ke stejnému původu (tj. reprezentují stejnou entitu), pokud mají stejný schéma, hostitele a port.

Takže musíme porovnat schéma, hostitele a port z dvou URI, pokud jsou stejné, pak mají tyto dvě URI stejný původ.

Funkční ukázka kódu:

function isOriginSameAsLocation(url) {
  var pageLocation = window.location;
  var URL_HOST_PATTERN = /(\w+:)?(?:\/\/)([\w.-]+)?(?::(\d+))?\/?/;
  var urlMatch = URL_HOST_PATTERN.exec(url) || [];
  var urlparts = {
      protocol:   urlMatch[1] || '',
      host:       urlMatch[2] || '',
      port:       urlMatch[3] || ''
  };

  function defaultPort(protocol) {
     return {'http:':80, 'https:':443}[protocol];
  }

  function portOf(location) {
     return location.port || defaultPort(location.protocol||pageLocation.protocol);
  }

  return !!(  (urlparts.protocol  && (urlparts.protocol  == pageLocation.protocol)) &&
              (urlparts.host     && (urlparts.host      == pageLocation.host))     &&
              (urlparts.host     && (portOf(urlparts) == portOf(pageLocation)))
          );
}