Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.12.2023, 15:09
Аспирант
Отправить личное сообщение для Arigato Посмотреть профиль Найти все сообщения от Arigato
 
Регистрация: 11.12.2011
Сообщений: 42

Запрос fetch() из поддомена к файлу, расположенному в домене уровнем выше
Допустим, есть сайт www.site.com, там есть некий файл, скажем, example.xml. Необходимо прочитать этот файл находясь в поддомене, то есть скрипт запускается из sub.site.com.

Пытаюсь сделать запрос с помощью

let url = "https://www.site.com/example.xml";
fetch(url).then((response) => {console.log("REAPONSE:"); console.log(response)});


В итоге получаю: Uncaught (in promise) TypeError: Failed to fetch.

Существует ли какой-либо способ считать файл с того же сайта, но с другого поддомена (с домена второго уровня, находясь на домене третьего уровня)?
Ответить с цитированием
  #2 (permalink)  
Старый 21.12.2023, 16:29
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,767

sub.site.com не является поддоменом www.site.com.
(Хотя является поддоменом site.com)
Следовательно обычные пляски с бубном вокруг CORS.
Сервер вместе с ответом должен посылать все необходимые заголовки.
Подробности тут https://developer.mozilla.org/ru/docs/Web/HTTP/CORS
Ответить с цитированием
  #3 (permalink)  
Старый 21.12.2023, 18:17
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

На домене с файлом нужно отдавать заголовок

Код:
Access-Control-Allow-Origin: домен_откуда_будет_идти_запрос
Ответить с цитированием
  #4 (permalink)  
Старый 22.12.2023, 10:35
Аспирант
Отправить личное сообщение для Arigato Посмотреть профиль Найти все сообщения от Arigato
 
Регистрация: 11.12.2011
Сообщений: 42

Сообщение от ruslan_mart
На домене с файлом нужно отдавать заголовок
Это вряд ли возможно, так как обращаюсь к файлу из расширения браузера, домен не мой.
Ответить с цитированием
  #5 (permalink)  
Старый 22.12.2023, 13:15
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Arigato, если расширение ваше, то в манифесте нужно указать пермишены на домен

Код:
"host_permissions": ["https://site.com/*"]
Ответить с цитированием
  #6 (permalink)  
Старый 28.12.2023, 09:36
Аспирант
Отправить личное сообщение для Arigato Посмотреть профиль Найти все сообщения от Arigato
 
Регистрация: 11.12.2011
Сообщений: 42

ruslan_mart, мне кажется, это не работает. У меня указано так:

Код:
	"host_permissions": ["*://*.site.com/*"],
	"permissions": ["scripting", "activeTab", "storage"],
Цитата:
Access to XMLHttpRequest at 'https://www.site.com/example.xml' from origin 'https://sub.site.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
let req = new XMLHttpRequest();
req.open("GET", url);

req.onload = () => {
	console.log("RESPONSE:");
	console.log(this.response);
}

console.log(url);

req.send();

Последний раз редактировалось Arigato, 28.12.2023 в 09:44.
Ответить с цитированием
  #7 (permalink)  
Старый 28.12.2023, 13:30
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

А так?

Код:
  "permissions": [
    "http://*.site.com/",
    "https://*.site.com/"
  ],
Ответить с цитированием
  #8 (permalink)  
Старый 28.12.2023, 13:45
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,139

Ему нужно разрешение не расширению а скрипту который он вставил в страницу. Так сделать не получится с любыми разрешениями.

Что бы обойти эту проблему скрипт должен обращаться с запросами к расширению а уже расширение должно отправлять запросы к серверу в интернете у каждого расширения создается свой уникальный домен для запросов который можно узнать через апи расширения.
Ответить с цитированием
  #9 (permalink)  
Старый 19.01.2024, 00:29
Аспирант
Отправить личное сообщение для Arigato Посмотреть профиль Найти все сообщения от Arigato
 
Регистрация: 11.12.2011
Сообщений: 42

Сообщение от MallSerg Посмотреть сообщение
Что бы обойти эту проблему скрипт должен обращаться с запросами к расширению а уже расширение должно отправлять запросы к серверу в интернете
В общем получилось следующим образом. В манифесте:

"permissions": ["scripting", "activeTab", "storage", "webRequest"],
"host_permissions": ["*://*.site.com/*"],
"background": {
	"service_worker": "scripts/service-worker.js"
},


В service-worker.js реализовал обработчик сообщений, суть в том, чтобы просто делать запросы куда просят:

chrome.runtime.onConnect.addListener(function(port) {
	port.onMessage.addListener(function(request) {
		if (port.name === "request") {
			const url = request.url;
			//console.log(url);
			fetch(url).then((response) => {
				let resp = {ok: response.ok}
				if (response.ok) {
					response.text().then((text) => {
						resp.text = text;
						port.postMessage(resp);
					});
				} else {
					port.postMessage(resp);
				}
			});
		}
	});
});


В content_scripts вместо обычного fetch() отправляется сообщение в service_worker с запросом нужного url:

let fetchResponse = (response) => {
	if (response.ok) {
		console.log(response.text);
	} else {
		console.log('ERROR');
	}
}

const port = chrome.runtime.connect({name: "request"});
port.postMessage({url: url});
port.onMessage.addListener(fetchResponse);


Работает.

Последний раз редактировалось Arigato, 19.01.2024 в 00:59.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск