Загадка в том, что я открываю окно с URL-адресом, который не указывает источник
У вас неправильное представление о заголовке запроса . Источник отправляется браузером при этих обстоятельствах ... в случае сценариев JavaScripts источник наследуется от страницы, на которой выполняется сценарий . Сообщение об ошибке, которое вы получаете, указывает на то, что ваше происхождение установлено на: «https://ec2b.foo.com»
Код существует только на одном сервере, поэтому нет возможности, что ec2b и ec2b.foo.com разные.
Обратите внимание, что одинаковый источник не означает одинаковый IP. Это означает, что кортеж protocol: host: port должен быть точно таким же, что означает, что foo.com
, ec2b.foo.com
и www.foo.com
имеют разное происхождение (даже если все они указывают на один и тот же IP-адрес).
Сообщение об ошибке указывает, что для вашего JavaScript задано происхождение: «https://ec2b.foo.com» ... теперь в вашем JavaScript файле вы открываете новое окно браузера, запустив следующее:
window.open("/path/main.html", ....); // <-- open a new browser window
Вы не упомянули, какой URL-адрес вы видите в этом новом окне (я подозреваю, что это «https://ec2b/path/main.html»). .. но это определенно не «https://ec2b.foo.com», поэтому, когда вы пытаетесь получить доступ к location.href
этого нового окна, вы получаете блокировку, потому что это запрос Cross-Origin.
Согласно MDN : Window.Open()
возвращает объект Window, представляющий только что созданное окно:
Возвращенная ссылка может использоваться для доступа к свойствам и методам нового окна, если оно соответствует требованиям безопасности политики Same-origin .
Вы также можете попробовать запустить следующий сценарий, чтобы выяснить происхождение вашего JavaScript файл:
tl2010handle = window.open("/path/main.html", 'tl2010', 'statusbar=no,toolbar=no,scrollbars=no,locationbar=no,setResizable=no,width=840,height=600');
console.log(tl2010handle.origin); // <-- origin of your script file
/*
* if you compare: tl2010handle.origin with the url display in tl2010handle window
* it should clarify why you are having a cross-origin request.
*/