Ответ 1
Есть много вариантов, один из которых сложнее, чем другой.
-
webRequest
API, в частностиonBeforeRequest
event. (Еще лучше, предстоящийdeclarativeWebRequest
API). - Скрипты содержимого. Инъекция
location.replace('http://example.com')
на странице. -
tabs
API. ИспользуйтеonUpdated
событие, чтобы определить, когда страница изменила его местоположение, иchrome.tabs.update
, чтобы изменить его URL. Избегайте бесконечного цикла!
Первый из них самый лучший, потому что он активирован до того, как страница будет запрошена. Второй может быть активирован после выполнения запроса, но до того, как страница будет отображена ("run_at":"document_start"
) или после ее отображения ("run_at":"document_end"
). Я упомянул последний для полноты, но вы не должны его использовать, потому что другие варианты лучше.
Вот пример использования API webRequest
, простого расширения, которое позволяет мне просматривать страницы в заливе Пират, хотя главные хосты сняты моим провайдером (фактический список URL-адресов намного длиннее, но я опустили их для примера).
См. шаблоны соответствия для объяснения в форматах URL.
manifest.json
{
"name": "The Pirate Bay",
"description": "Redirect The Pirate Bay to a different host",
"version": "1.0",
"manifest_version": 2,
"background": {"scripts":["background.js"]},
"permissions": [
"webRequest",
"*://thepiratebay.se/*",
"*://www.thepiratebay.se/*",
"webRequestBlocking"
]
}
background.js
var host = "http://tpb.pirateparty.org.uk";
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
return {redirectUrl: host + details.url.match(/^https?:\/\/[^\/]+([\S\s]*)/)[1]};
},
{
urls: [
"*://piratebay.se/*",
"*://www.piratebay.se/*"
],
types: ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]
},
["blocking"]
);