javascript Kako provjeriti je li URL iste podrijetlo kao trenutna stranica?


Kako mogu provjeriti je li određeni URL niz iz iste domene/hosta kao trenutna stranica? Na primjer, ako želim vezati na linkove, ali spriječiti zadano samo na linkovima prema istom hostu...

Odgovor #1

Ovo bi danas trebalo biti sigurno za korištenje:

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))

Odgovor #2

Definicija podrijetla iz RFC 6454:

Otprilike govoreći, dva URI-ja pripadaju istom podrijetlu (tj. predstavljaju istu glavnu jedinicu) ako imaju isti shemu, domaćina i port.

Dakle, trebamo usporediti shemu, domaćina i port iz dva URI-ja, ako su isti, tada su ta dva URI-ja istog podrijetla.

Radni primjer koda:

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)))
          );
}