webRequest.onBeforeRequest
Dieses Ereignis wird ausgelöst, wenn eine Anfrage gesendet werden soll und bevor die Header verfügbar sind. Dies ist ein guter Punkt, um zuzuhören, wenn Sie die Anfrage abbrechen oder umleiten möchten.
Um die Anfrage abzubrechen oder umzuleiten, fügen Sie zuerst "blocking"
zum Array-Argument extraInfoSpec
in addListener()
hinzu. Geben Sie dann in der Listener-Funktion ein BlockingResponse
-Objekt zurück und setzen Sie die entsprechende Eigenschaft:
- Um die Anfrage abzubrechen, schließen Sie eine Eigenschaft
cancel
mit dem Werttrue
ein. - Um die Anfrage umzuleiten, schließen Sie eine Eigenschaft
redirectUrl
mit dem Wert der URL ein, zu der Sie umleiten möchten.
Wenn eine Erweiterung eine öffentliche (z.B. HTTPS) URL zu einer Erweiterungsseite umleiten möchte, muss die manifest.json-Datei der Erweiterung einen web_accessible_resources Schlüssel enthalten, der die URL für die Erweiterungsseite auflistet.
Wenn mehrere blockierende Handler eine Anfrage modifizieren, wird nur eine Reihe von Modifikationen wirksam. Umleitungen und Abbrüche haben die gleiche Priorität. Wenn Sie also eine Anfrage abgebrochen haben, könnten Sie dieselbe Anfrage erneut sehen, wenn ein anderer blockierender Handler die Anfrage umgeleitet hat.
Ab Firefox 52 kann der Listener anstelle der Rückgabe von BlockingResponse
ein Promise
zurückgeben, das mit einem BlockingResponse
aufgelöst wird. Dies ermöglicht es dem Listener, die Anfrage asynchron zu verarbeiten.
Wenn Sie "blocking"
verwenden, müssen Sie die "webRequestBlocking" API-Berechtigung in Ihrer manifest.json haben.
Syntax
browser.webRequest.onBeforeRequest.addListener(
listener, // function
filter, // object
extraInfoSpec // optional array of strings
)
browser.webRequest.onBeforeRequest.removeListener(listener)
browser.webRequest.onBeforeRequest.hasListener(listener)
Ereignisse haben drei Funktionen:
addListener(listener, filter, extraInfoSpec)
-
Fügt diesem Ereignis einen Listener hinzu.
removeListener(listener)
-
Stoppt das Zuhören für dieses Ereignis. Das Argument
listener
ist der zu entfernende Listener. hasListener(listener)
-
Prüft, ob
listener
für dieses Ereignis registriert ist. Gibttrue
zurück, wenn es zuhört, ansonstenfalse
.
addListener-Syntax
Parameter
listener
-
Die Funktion, die aufgerufen wird, wenn dieses Ereignis eintritt. Der Funktion wird dieses Argument übergeben:
Rückgaben:
webRequest.BlockingResponse
. Wenn"blocking"
im ParameterextraInfoSpec
angegeben ist, sollte der Ereignis-Listener einBlockingResponse
-Objekt zurückgeben und entweder seinecancel
- oderredirectUrl
-Eigenschaften setzen. Ab Firefox 52 kann der Listener anstelle der Rückgabe vonBlockingResponse
einPromise
zurückgeben, das mit einemBlockingResponse
aufgelöst wird. Dies ermöglicht es dem Listener, die Anfrage asynchron zu verarbeiten. filter
-
webRequest.RequestFilter
. Ein Filter, der die Ereignisse einschränkt, die an diesen Listener gesendet werden. extraInfoSpec
Optional-
array
vonstring
. Zusätzliche Optionen für das Ereignis. Sie können einen der folgenden Werte übergeben:"blocking"
: macht die Anfrage synchron, damit Sie die Anfrage abbrechen oder umleiten können"requestBody"
: umfasstrequestBody
imdetails
-Objekt, das an den Listener übergeben wird
Zusätzliche Objekte
details
-
string
. Wenn die Anfrage von einem Tab stammt, der in einer kontextuellen Identität geöffnet ist, ist dies die ID des Cookie-Stores der kontextuellen Identität. Weitere Informationen finden Sie unter Arbeiten mit kontextuellen Identitäten. documentUrl
-
string
. URL des Dokuments, in dem die Ressource geladen wird. Wenn beispielsweise die Webseite unter "https://example.com" ein Bild oder ein<iframe>
enthält, ist diedocumentUrl
für das Bild oder das<iframe>
"https://example.com". Bei einem Dokument der obersten Ebene istdocumentUrl
undefiniert. frameAncestors
-
array
. Enthält Informationen für jedes Dokument in der Rahmenhierarchie bis zum Dokument der höchsten Ebene. Das erste Element im Array enthält Informationen über das unmittelbare übergeordnete Dokument des angeforderten Dokuments, und das letzte Element enthält Informationen über das Dokument der obersten Ebene. Wenn der Ladevorgang tatsächlich für das Dokument der obersten Ebene erfolgt, ist dieses Array leer. frameId
-
integer
. Null, wenn die Anfrage im Hauptframe erfolgt; ein positiver Wert ist die ID eines Unterframes, in dem die Anfrage erfolgt. Wenn das Dokument eines (Unter-)Frames geladen wird (type
istmain_frame
odersub_frame
), zeigtframeId
die ID dieses Rahmens an, nicht die ID des äußeren Rahmens. Rahmen-IDs sind innerhalb eines Tabs eindeutig. incognito
-
boolean
. Ob die Anfrage von einem privaten Browserfenster stammt. method
-
string
. Standard-HTTP-Methode: zum Beispiel "GET" oder "POST". originUrl
-
string
. URL der Ressource, die die Anfrage ausgelöst hat. Zum Beispiel, wenn "https://example.com" einen Link enthält und der Benutzer auf den Link klickt, ist dieoriginUrl
der resultierenden Anfrage "https://example.com".Die
originUrl
ist oft, aber nicht immer die gleiche wie diedocumentUrl
. Beispielsweise, wenn eine Seite ein<iframe>
enthält und das<iframe>
einen Link enthält, der ein neues Dokument in das<iframe>
lädt, dann ist diedocumentUrl
der resultierenden Anfrage das übergeordnete Dokument des<iframe>
, aber dieoriginUrl
ist die URL des Dokuments im<iframe>
, das den Link enthalten hat. parentFrameId
-
integer
. ID des Rahmens, der den Rahmen enthält, der die Anfrage gesendet hat. Wird auf -1 gesetzt, wenn kein übergeordneter Rahmen vorhanden ist. proxyInfo
-
object
. Diese Eigenschaft ist nur vorhanden, wenn die Anfrage über einen Proxy gesendet wird. Sie enthält die folgenden Eigenschaften:host
-
string
. Der Hostname des Proxy-Servers. port
-
integer
. Die Portnummer des Proxy-Servers. type
-
string
. Der Typ des Proxy-Servers. Einer von:- "http": HTTP-Proxy (oder SSL CONNECT für HTTPS)
- "https": HTTP-Proxierung über TLS-Verbindung zum Proxy
- "socks": SOCKS v5 Proxy
- "socks4": SOCKS v4 Proxy
- "direct": kein Proxy
- "unknown": unbekannter Proxy
username
-
string
. Benutzername für den Proxy-Dienst. proxyDNS
-
boolean
. Wahr, wenn der Proxy die Domainnamenauflösung basierend auf dem bereitgestellten Hostnamen vornimmt, was bedeutet, dass der Client keine eigene DNS-Suche durchführen sollte. failoverTimeout
-
integer
. Ausfall-Timeout in Sekunden. Wenn die Proxy-Verbindung fehlschlägt, wird der Proxy für diesen Zeitraum nicht mehr verwendet.
requestBody
Optional-
object
. Enthält die HTTP-Anfragedaten des Anfragetextes. Wird nur bereitgestellt, wenn dasextraInfoSpec
-Array"requestBody"
enthält.error
Optional-
string
. Dieser Wert wird gesetzt, wenn beim Abrufen der Daten des Anfragetextes Fehler aufgetreten sind. formData
Optional-
object
. Dieses Objekt ist vorhanden, wenn die Anfragemethode POST ist und der Text eine Folge von Schlüssel-Wert-Paaren ist, die in UTF-8 als entweder "multipart/form-data" oder "application/x-www-form-urlencoded" kodiert sind.Es handelt sich um ein Wörterbuch, in dem jeder Schlüssel die Liste aller Werte für diesen Schlüssel enthält. Zum Beispiel:
{'key': ['value1', 'value2']}
. Wenn die Daten eines anderen Medientyps sind oder wenn sie fehlerhaft sind, ist das Objekt nicht vorhanden. raw
Optional-
array
von
. Wenn die Anfragemethode PUT oder POST ist und der Text nicht bereits inwebRequest.UploadData
formData
analysiert ist, dann enthält dieses Array die nicht analysierten Elemente des Anfragetextes.
requestId
-
string
. Die ID der Anfrage. Anfragen-IDs sind innerhalb einer Browsersitzung eindeutig, sodass Sie sie verwenden können, um verschiedene Ereignisse, die mit derselben Anfrage verbunden sind, in Beziehung zu setzen. tabId
-
integer
. ID des Tabs, in dem die Anfrage stattfindet. Wird auf -1 gesetzt, wenn die Anfrage nicht mit einem Tab verbunden ist. thirdParty
-
boolean
. Gibt an, ob die Anfrage und ihre Inhaltsfensterhierarchie von Dritten stammt. timeStamp
-
number
. Die Zeit, zu der dieses Ereignis ausgelöst wurde, in Millisekunden seit der Epoche. type
-
webRequest.ResourceType
. Der Typ der angeforderten Ressource: zum Beispiel "image", "script", "stylesheet". url
-
string
. Ziel der Anfrage. urlClassification
-
object
. Der Typ der Verfolgung, der mit der Anfrage verbunden ist, wenn die Anfrage durch Firefox Tracking Protection klassifiziert wird. Dieses Objekt hat die folgenden Eigenschaften:firstParty
-
array
vonstrings
. Klassifikationsflags für den First-Party der Anfrage. thirdParty
-
array
vonstrings
. Klassifikationsflags für die Anfrage oder die Fensterhierarchie ihrer Dritten.
Die Klassifikationsflags umfassen:
fingerprinting
undfingerprinting_content
: zeigt an, dass die Anfrage in Fingerprinting involviert ist ("ein Ursprung, der Fingerprinting betreibt").fingerprinting
zeigt an, dass die Domäne in der Kategorie Fingerprinting und Verfolgung ist. Beispiele für diese Art von Domänen sind Werbetreibende, die ein Profil mit dem besuchenden Benutzer verknüpfen möchten.fingerprinting_content
zeigt an, dass die Domäne in der Kategorie Fingerprinting, aber nicht in der Kategorie Verfolgung ist. Beispiele für diese Art von Domänen sind Zahlungsanbieter, die Fingerprinting-Techniken verwenden, um den besuchenden Benutzer zu Identifikationszwecken zu erkennen.
cryptomining
undcryptomining_content
: ähnlich der Fingerprinting-Kategorie, aber für Kryptomining-Ressourcen.tracking
,tracking_ad
,tracking_analytics
,tracking_social
undtracking_content
: zeigt an, dass die Anfrage in Verfolgung involviert ist.tracking
ist jede generische Verfolgungsanfrage, die Suffixead
,analytics
,social
undcontent
identifizieren den Typ des Trackers.any_basic_tracking
: ein Meta-Flag, das Tracking- und Fingerprinting-Flags kombiniert, ausgenommentracking_content
undfingerprinting_content
.any_strict_tracking
: ein Meta-Flag, das alle Tracking- und Fingerprinting-Flags kombiniert.any_social_tracking
: ein Meta-Flag, das alle sozialen Tracking-Flags kombiniert.
Browser-Kompatibilität
BCD tables only load in the browser
Reihenfolge der DNS-Auflösung, wenn BlockingResponse verwendet wird
Zur DNS-Auflösung, wenn BlockingResponse mit OnBeforeRequest verwendet wird: Im HTTP-Kanal passiert onBeforeRequest mit Blockierungsantwort vor der DNS-Auflösung und auch vor einer spekulativen Verbindung. Bei anderen Kanälen kann eine spekulative Verbindung dazu führen, dass DNS-Anfragen vor onBeforeRequest geschehen. Diese Reihenfolge ist nichts, worauf sich ein Erweiterungsentwickler verlassen sollte, da sie je nach Browser und von einer Browserversion zur anderen, geschweige denn von einem Anforderungskanal zum anderen variieren kann. Bitte beachten Sie die Klärung zur BugZilla-Angelegenheit, bereitgestellt von Mozilla-Entwicklern zur Reihenfolge der DNS-Auflösung.
Beispiele
Dieser Code protokolliert die URL für jede angeforderte Ressource, die dem <all_urls> Muster entspricht:
function logURL(requestDetails) {
console.log(`Loading: ${requestDetails.url}`);
}
browser.webRequest.onBeforeRequest.addListener(logURL, {
urls: ["<all_urls>"],
});
Dieser Code bricht Anfragen für Bilder ab, die an URLs unter "https://developer.mozilla.org/" gesendet werden (um den Effekt zu sehen, besuchen Sie eine beliebige Seite auf MDN, die Bilder enthält, wie webRequest):
// match pattern for the URLs to redirect
let pattern = "https://developer.mozilla.org/*";
// cancel function returns an object
// which contains a property `cancel` set to `true`
function cancel(requestDetails) {
console.log(`Canceling: ${requestDetails.url}`);
return { cancel: true };
}
// add the listener,
// passing the filter argument and "blocking"
browser.webRequest.onBeforeRequest.addListener(
cancel,
{ urls: [pattern], types: ["image"] },
["blocking"],
);
Dieser Code ersetzt durch Umleitung alle Netzwerk-Anfragen für Bilder, die an URLs unter "https://developer.mozilla.org/" gesendet werden (um den Effekt zu sehen, besuchen Sie eine beliebige Seite auf MDN, die Bilder enthält, wie webRequest):
// match pattern for the URLs to redirect
let pattern = "https://developer.mozilla.org/*";
// redirect function
// returns an object with a property `redirectURL`
// set to the new URL
function redirect(requestDetails) {
console.log(`Redirecting: ${requestDetails.url}`);
return {
redirectUrl:
"https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif",
};
}
// add the listener,
// passing the filter argument and "blocking"
browser.webRequest.onBeforeRequest.addListener(
redirect,
{ urls: [pattern], types: ["image"] },
["blocking"],
);
Dieser Code entspricht genau dem vorherigen Beispiel, außer dass der Listener die Anfrage asynchron verarbeitet. Er gibt ein Promise
zurück, das einen Timer setzt und mit der Umleitungs-URL aufgelöst wird, wenn der Timer abläuft:
// match pattern for the URLs to redirect
let pattern = "https://developer.mozilla.org/*";
// URL we will redirect to
let redirectUrl =
"https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif";
// redirect function returns a Promise
// which is resolved with the redirect URL when a timer expires
function redirectAsync(requestDetails) {
console.log(`Redirecting async: ${requestDetails.url}`);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({ redirectUrl });
}, 2000);
});
}
// add the listener,
// passing the filter argument and "blocking"
browser.webRequest.onBeforeRequest.addListener(
redirectAsync,
{ urls: [pattern], types: ["image"] },
["blocking"],
);
Ein weiteres Beispiel, das alle Bilder auf eine Daten-URL umleitet:
let pattern = "https://developer.mozilla.org/*";
let image = `
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
<rect style="stroke-width: 10; stroke: #666;" width="100%" height="100%" fill="#d4d0c8" />
<text transform="translate(0, 9)" x="50%" y="50%" width="100%" fill="#666" height="100%" style="text-anchor: middle; font: bold 10pt 'Segoe UI', Arial, Helvetica, Sans-serif;">Blocked</text>
</svg>
`;
function listener(details) {
const redirectUrl = `data:image/svg+xml,${encodeURIComponent(image)}`;
return { redirectUrl };
}
browser.webRequest.onBeforeRequest.addListener(
listener,
{ urls: [pattern], types: ["image"] },
["blocking"],
);
Hier ist eine weitere Version:
function randomColor() {
return `#${Math.floor(Math.random() * 16777215).toString(16)}`;
}
const pattern = "https://developer.mozilla.org/*";
let image = `
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
<rect width="100%" height="100%" fill="${randomColor()}"/>
</svg>
`;
function listener(details) {
const redirectUrl = `data:image/svg+xml,${encodeURIComponent(image)}`;
return { redirectUrl };
}
browser.webRequest.onBeforeRequest.addListener(
listener,
{ urls: [pattern], types: ["image"] },
["blocking"],
);
Beispiel-Erweiterungen
Hinweis: Diese API basiert auf der chrome.webRequest
API von Chromium. Diese Dokumentation stammt aus web_request.json
im Chromium-Code.