javascript Hvordan tjekker man, om en URL har samme oprindelse som den nuværende side?
Hvordan kan jeg tjekke, om en specifik URL-streng kommer fra samme oprindelse/vært som den aktuelle side? For eksempel, hvis jeg ville binde til links, men kun forhindre standardhandling på links til samme vært...
Svar #1
Dette burde være sikkert at bruge nu om dage:
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))Svar #2
Oprindelsesdefinitionen fra RFC 6454:
Omtrent sagt er to URI'er en del af samme oprindelse (dvs. repræsenterer samme principal), hvis de har samme skema, værtsnavn og port.
Så vi har brug for at sammenligne skema, vært og port fra to URI'er; hvis de er de samme, så har disse to URI'er samme oprindelse.
Et fungerende kodeeksempel:
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)))
);
}
