#google-chrome-extension #amazon-s3 #cors #browser-cache
#google-chrome-extension #amazon-s3 #cors #кэш браузера
Вопрос:
ДА. это сложный вопрос. я постараюсь изложить это вкратце.
Мой веб-сайт извлекает ресурсы из s3. У меня также есть расширение, которому требуется предварительная выборка этого файла s3, когда кто-то выполняет запрос Google, поэтому позже, когда они заходят на мой сайт, ресурс кэшируется. На данный момент мне, вероятно, следует подчеркнуть, что я не делаю ничего вредоносного. просто вопрос пользовательского опыта. Моя проблема в том. при выполнении ajax-запроса к s3 из расширения (либо из content-script, либо из background) заголовок origin не отправляется. Это означает, что ресурс загружается и кэшируется без заголовка allow origin. s3 не добавляет этот разрешающий источник: * если в запросе нет источника. итак, позже на моем сайте произошел сбой из-за отсутствия заголовка allow-origin в кэшированном файле:-(
Есть идеи о лучшем способе предварительной выборки из кэша браузера?
Есть ли способ принудительно отправить ajax-запрос на отправку источника? Любое происхождение? Поскольку у меня есть allow-origin: * в моей корзине s3, я думаю, что любой источник будет принимать значение null. Спасибо
Редактировать: в итоге использовалось одно из решений Rob W. Ты потрясающий. Позвольте мне прокомментировать каждый из предложенных им вариантов:
-
Не добавлять предустановки хоста в мой манифест — умная идея, но у меня не сработает, поскольку у меня есть скрипт содержимого, который запускается на любом веб-сайте, поэтому я должен использовать универсальный шаблон, и я не думаю, что есть опция разрешения «исключить».
-
Я попробовал это, он выдает нулевой источник, который, как и ожидалось, заканчивается в S3 отправкой заголовка allow-origin: *, как и требовалось. это означает, что я не получаю ошибку «отсутствует заголовок allow-origin», однако файл затем не передается из кэша. Я предполагаю, что для того, чтобы он действительно обслуживался из кэша в Chrome, это должно быть точно такого же происхождения. итак, это было очень близко, но недостаточно.
-
третий вариант — это прелесть. И это самое простое. Я не знал, что могу манипулировать заголовком origin. Итак, я делаю это и устанавливаю точное происхождение моего веб-сайта — и это работает. Файл кэшируется, а затем отправляется из кэша. Я должен подчеркнуть, что мне пришлось добавить фильтр URL, чтобы применять его только к запросам, отправляемым в мою корзину s3, в противном случае я ожидаю, что это приведет к хаосу в браузере пользователя.
Спасибо. Отличная работа
Ответ №1:
У вас есть три варианта:
- Не добавляйте разрешение хоста для S3 в свой файл манифеста. Тогда у расширения не будет общего разрешения на доступ к ресурсу, и вместе с запросом будет отправлен
Origin
заголовок запроса. -
Используйте фрейм без расширения для выполнения AJAX-запроса. Например, следующий метод приведет к получению запроса GET из разных источников с помощью
Origin: null
.function prefetchWithOrigin(url) { var html = '<script>(' function(url) { var x = new XMLHttpRequest(); x.open('GET', url); x.onloadend = function() { parent.postMessage('done', '*'); }; x.send(); } ')(' JSON.stringify(url) ');</script>'; var f = document.createElement('iframe'); f.src = 'data:text/html,' encodeURIComponent(html); (document.body || document.documentElement).appendChild(f); window.addEventListener('message', function listener(event) { // Remove frame upon completion if (event.source === f.contentWindow) { window.removeEventListener('message', listener); f.remove(); } }); }
- Используйте
chrome.webRequest.onBeforeSendHeaders
событие, чтобы вручную добавить заголовок Origin.
Комментарии:
1. @Ilanlewin XHR из разных источников не разрешен, если разрешение хоста не указано в
permissions
разделе файла манифеста, даже если существует сценарий содержимого с шаблоном «соответствует». Попробуйте, вы увидитеOrigin: chrome-extension://[ORIGIN]
заголовок запроса приhttps://google.com/
доступе без разрешения origin. Эта функция разработана специально, поэтому на нее можно положиться.2. Роб, я не знаю, что именно ты имел в виду под последним комментарием, но у меня в файле манифеста есть общие разрешения как для общих разрешений, так и для сценариев содержимого… вот так «разрешения»: [«http:// */*», «https://*/*», «content_scripts»: [ { «совпадения»: [«http://*/*»,»https://*/*»],
3. @Ilanlewin Если URL веб-сайта, к которому вы пытаетесь получить доступ с помощью AJAX (XMLHttpRequest), не соответствует ни одному из шаблонов соответствия в вашем
permissions
массиве, Chrome добавитOrigin
заголовок. То, указан ли хост также вmatches
incontent_scripts
, не имеет значения. Удалитеhttp://*/*
иhttps://*/*
изpermissions
, и Chrome включитOrigin
заголовок запроса.