Recherche de site Web

javascript Comment vérifier si une URL est de la même origine que la page actuelle ?


Comment puis-je vérifier si une chaîne d'URL spécifique provient du même origine/hôte que la page actuelle ? Par exemple, si je voulais lier des liens, mais seulement empêcher l'action par défaut sur les liens vers le même hôte...

Réponse n°1

Cela devrait être sûr à utiliser de nos jours :

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

Réponse n°2

La définition de Origin selon le RFC 6454 :

De manière générale, deux URI font partie de la même origine (c'est-à-dire représentent le même principal) si elles ont le même schéma, hôte et port.

Donc nous devons comparer le schéma, l'hôte et le port de deux URI, si ils sont les mêmes, alors ces deux URI ont la même origine.

Un extrait de code fonctionnel :

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