Ajax вызов локального хоста с сайта, загруженного через HTTPS, не удается в Chrome
-------------------- ОБНОВЛЕНИЕ 2 ------------------------
Теперь я вижу, что то, что я пытаюсь достичь, невозможно с помощью Chrome. Но меня все еще интересует, почему в Chrome политика более строгая, чем, например, в Firefox? Или, возможно, что firefox на самом деле не выполняет вызов, но с точки зрения javascript он считает, что вызов не состоялся, а не все вместе заблокировано?
---------------- ОБНОВЛЕНИЕ 1 ----------------------
Похоже, проблема действительно связана с вызовом http с https-сайта, эта ошибка выдается в консоли chrome:
Смешанный контент: страница по адресу https://login.mysite.com/mp/quickstore1 была загружена через HTTPS, но затребована небезопасная конечная точка XMLHttpRequest ' http://localhost/biztv_local/video/video_check.php?video=253d01cb490c1cbaaa2b7dc031eaa9f5.mov&fullscreen=on'. Этот запрос был заблокирован; содержание должно быть подано через HTTPS.
Тогда возникает вопрос, почему Firefox это позволяет, и есть ли способ сделать так, чтобы Chrome позволял это делать. Это действительно работало хорошо только несколько месяцев назад.
Оригинальный вопрос:
У меня есть некоторый jQuery, который делает вызов ajax на http (сайт, который звонит, загружается через https).
Более того, вызов с моего https-сайта происходит с помощью скрипта на локальном хосте на клиентском компьютере, но файл начинается с
<?php header('Access-Control-Allow-Origin: *'); ?>
Так что все в порядке. Вы можете сказать, что это специфическая настройка, но клиент на самом деле является медиаплеером.
Раньше он всегда работал нормально и все еще отлично работает в Firefox, но примерно два месяца назад он не работает в Chrome.
Были ли изменения в политиках в chrome в отношении этого типа вызовов? Или есть ошибка в моем коде ниже, что Firefox удается разобрать, а Chrome нет?
Ошибка возникает, только когда файл НЕ присутствует на локальном хосте (то есть, если обычный веб-пользователь заходит на этот сайт со своим собственным браузером, естественно, у него не будет файла на локальном хосте, у большинства даже не будет локального хоста) так что одна теория может заключаться в том, что, поскольку файл отсутствует, Access-Control-Allow-Origin: * никогда не встречается, и поэтому вызов полностью считается небезопасным или не разрешенным chrome, поэтому он никогда не завершается?
Если да, есть ли обработчик событий, который я могу прикрепить к своему методу jQuery.ajax, чтобы вместо этого получить этот результат? На данный момент complete никогда не запускается, если файл на localhost отсутствует.
before : function( self ) {
var myself = this;
var data = self.slides[self.nextSlide-1].data;
var html = myself.getHtml(data);
$('#module_'+self.moduleId+'-slide_'+self.slideToCreate).html(html);
//This is the fullscreen-always version of the video template
var fullscreen = 'on';
//console.log('runnin beforeSlide method for a video template');
var videoCallStringBase = "http://localhost/biztv_local/video/video_check.php?"; //to call mediaplayers localhost
var videoContent='video='+data['filename_machine']+'&fullscreen='+fullscreen;
var videoCallString = videoCallStringBase + videoContent;
//TODO: works when file video_check.php is found, but if it isn't, it will wait for a video to play. It should skip then as well...
//UPDATE: Isn't this fixed already? Debug once env. is set up
console.log('checking for '+videoCallString);
jQuery.ajax({
url: videoCallString,
success: function(result) {
//...if it isn't, we can't playback the video so skip next slide
if (result != 1) {
console.log('found no video_check on localhost so skip slide '+self.nextSlide);
self.skip();
}
else {
//success, proceed as normal
self.beforeComplete();
}
},
complete: function(xhr, data) {
if (xhr.status != 200) {
//we could not find the check-video file on localhost so skip next slide
console.log('found no video_check on localhost so skip slide '+self.nextSlide);
self.skip();
}
else {
//success, proceed as normal
self.beforeComplete();
}
}, //above would cause a double-slide-skip, I think. Removed for now, that should be trapped by the fail clause anyways.
async: true
});