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