jQuery.load (), смешанный HTTP / HTTPS и Internet Explorer - PullRequest
2 голосов
/ 10 декабря 2010

Я пытаюсь загрузить удаленную HTML-страницу, используя jQuery.load('https://someurl.com .someClass'). Страница, выполняющая загрузку, находится на HTTPS; Удаленная страница доступна как HTTP и HTTPS. В разумных браузерах все работает нормально, но IE выдает смешанное предупреждение о безопасности содержимого HTTP / HTTPS - на удаленной странице есть ссылки CSS и JS, включаемые по ссылкам HTTP, даже когда запрашивается как HTTPS Любые подсказки о том, как успешно извлечь файл со смешанным содержимым в IE без предупреждения? Изменение удаленной страницы не вариант.

EDIT

Чтобы было ясно, я пытаюсь загрузить удаленный файл по HTTPS. Файл содержит ссылки на ресурсы HTTP (img, css, js); поскольку я предоставляю селектор для .load(), разумные браузеры не пытаются анализировать и выполнять документ; IE делает.

Ответы [ 2 ]

4 голосов
/ 10 декабря 2010

Вы не можете обойти предупреждение о смешанном контенте в IE. Если удаленный ресурс доступен через HTTP и HTTPS, вы можете убедиться, что ваши протоколы совпадают jQuery.load(location.protocol + '//someurl.com .someClass')


Обновлено в зависимости от проблемы смешанного содержимого на удаленной странице:

jQuery.load загружает весь текст ответа в фрагмент документа перед извлечением соответствующей части, указанной селектором (см. jQuery 1.4.4 ajax.js ). Вся удаленная страница анализируется как HTML и должна пройти через процессы безопасности браузера; во многих отношениях проще убедиться, что ответ «чистый», убедившись, что все протоколы совпадают, и / или возвращая фрагмент, только если это все, что вам нужно.

Если вы не будете изменять другой ресурс, который будет гораздо более надежным , вам придется заменить все вхождения HTTP на HTTPS (или наоборот), пока удаленный ресурс все еще работает просто строка Вот хрупкий плагин jQuery в качестве примера этой техники, в основном скопированный из функции jQuery 1.4.4 $ .load :

(function($){
    var http = "http:",
        https = "https:",
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
        proto = location.protocol,
        otherProtoUri = new RegExp("\\b" + (proto === http ? https : http) + "(//[a-z\\d.-]+)", "gi");

    $.fn.protocolModifyLoad = function(url, yesIKnowThisIsFragile, selector) {
        var self = this;

        if ( !this.length || !yesIKnowThisIsFragile) {
            return this;
        }

        $.ajax({
            url: url,
            type: "GET",
            dataType: "html",
            complete: function( res, status ) {
                // If successful, inject the HTML into all the matched elements
                if ( status === "success" || status === "notmodified" ) {
                    // Force occurences of the other protocol into the current one
                    var response = res.responseText.replace(otherProtoUri, proto + "$1");

                    // See if a selector was specified
                    self.html( selector ?
                        // Create a dummy div to hold the results
                        jQuery("<div>")
                            // inject the contents of the document in, removing the scripts
                            // to avoid any 'Permission Denied' errors in IE
                            .append(response.replace(rscript, ""))

                            // Locate the specified elements
                            .find(selector) :

                        // If not, just inject the full result
                        response);
                }
            }
        });

        return this;
    };
})(jQuery);

Использование: $('#your > .selector').protocolModifyLoad(location.protocol + '//someurl.com', 'thisIsFragile!!!', '.someClass');

Эта функция пропускает аргументы callback и params $.load, а аргумент yesIKnowThisIsFragile был добавлен в качестве тонкого напоминания.

0 голосов
/ 10 декабря 2010

Если защищенная страница загружает какой-либо незащищенный ресурс, она выдаст предупреждение. Единственный способ обойти это - загрузить все с https.

Даже в других браузерах должно отображаться предупреждение (возможно, слева от адреса в FF?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...