internet-explorer - Невозможно отобразить PDF из HTTPS в IE 8(на 64-разрядной версии Vista)




internet-explorer-8 64bit (8)

Думал, что вернусь и даю окончательный ответ.

Спасибо всем, кто предложил «Не сохранять зашифрованные страницы на диск».

Я последовал совету Эрик Лоу и поставил:

Cache-Control: private 

Я также обнаружил, что у меня есть Pragma: no-cache , который я удалил.

Сейчас работает как шарм :)

У меня есть домашний сервер HTTPS, который обслуживает простые файлы (он встроен в мое приложение). Он отлично работает - использовал его навсегда.

Недавно добавленная поддержка SSL - Chrome, FireFox и IE все понравятся и загружают страницы просто отлично.

Проблема, которую я нахожу, это когда я пытаюсь загрузить файл PDF по HTTPS-соединению. По какой-то причине PDF никогда не отображается в IE 8 (64-разрядная версия на 64-разрядной версии Vista). Он отлично работает в Chrome. И он отлично работает в IE 8 при использовании простого HTTP-протокола - только при использовании HTTPS.

ПРИМЕЧАНИЕ. Когда упоминается IE 8, это 32-разрядный IE 8 на 64-битной Vista, хотя 64-разрядный IE 8 имеет такое же поведение.

Это заставляет меня думать, что это проблема IE 8 / HTTPS / PDF / 64-разрядной ОС, но я не уверен.

DebugBar для IE 8 показывает, что запрос и ответ прошли точно так, как ожидалось, - никаких ошибок вообще. В IE 8 отсутствуют какие-либо ошибки или что-то еще - чистый белый экран (или страница, которая была отображена до того, как я попытался загрузить PDF-файл). Очищенный кеш / файлы cookie / и т. Д.

Существуют ли какие-либо известные проблемы с IE / PDF / HTTPS?


У меня была аналогичная проблема с IE8 и https. Когда я попытался передать PDF в новое окно, вместо этого я получил пустую html-страницу (она работала в FireFox, и если она не была через https). После большого поиска и поиска различных вариантов заголовков ответов решение для меня заключалось в том, чтобы установить:

Response.AppendHeader("Accept-Ranges", "none");

Это загружает весь pdf-файл перед его открытием, который менее удобен для пользователя, если он является очень большим pdf. Но в моем случае большинство PDF-страниц было всего лишь несколькими страницами. Надеюсь, это поможет кому-то.


Как пользователь, у меня была такая же проблема с загрузкой файлов PDF из Schwab.com. Совет «выключить» Не сохранять зашифрованные страницы на диск на вкладке «Дополнительно» диалогового окна «Свойства Интернета»: http://support.microsoft.com/kb/812935 «работал для меня.


response.setHeader("Cache-Control","private");

сделал трюк для нас в IE8 и IE9.

Это не требует изменения настроек в браузере.


Мое решение (нам потребовались дни, чтобы играть с заголовками, чтобы заставить это работать):

            if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer"
                && System.Web.HttpContext.Current.Request.Browser.Version == "8.0")
            {
                System.Web.HttpContext.Current.Response.Clear();
                System.Web.HttpContext.Current.Response.ClearContent();
                System.Web.HttpContext.Current.Response.ClearHeaders();
                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

                System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public");
                System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60");
                System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary");

                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename);
                System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

Надежда, которая помогает кому-то


Вы используете 32-разрядную или 64-разрядную версию IE на Vista 64? Он поставляется с обоими. В большинстве случаев 32-разрядная версия используется, так как не многие плагины поддерживают 64-разрядную версию.

Я бы посмотрел, есть ли разница между ними. Если он работает в IE 8 32 бит на Vista 64, это может быть проблемой с 64-разрядной версией объекта вспомогательного браузера (BHO).

Кроме того, проверьте, есть ли у диспетчера задач наличие * * 32 после имени процесса, если другие браузеры работают в 32-битном режиме.

Еще одна вещь, которую я хотел бы проверить, является ли HTTPS причиной того, что IE8 не кэширует файл PDF по какой-либо причине (трафик HTTPS обычно не кэшируется). Я бы запустил procmon чтобы увидеть, замечаете ли вы файл PDF, который записывается в файловую систему. Могут быть настройки политики, которые могут потребоваться изменить. Я не уверен, есть ли альтернативный способ сказать, что у вас есть PDF-файл, который не должен записываться на диск, но может отображаться.


Я столкнулся с этой же проблемой и мог заставить ее работать, попросив пользователя изменить свои параметры безопасности, чтобы отключить. Не сохраняйте зашифрованные страницы на диске на вкладке «Дополнительно» диалогового окна «Свойства Интернета»: http://support.microsoft.com/kb/812935

... затем с мгновенной паникой я начал смотреть на код (ASP.NET с помощью VB). Я использовал fiddler и обнаружил, что даже когда я не указывал заголовок управления кешем, казалось, что Framework автоматически определял для меня отсутствие магазина. Ключ к решению проблемы был на самом деле в этом вопросе PHP . Установив заголовок управления кешем max-age = 1, файл будет кэшироваться в течение 1 секунды, достаточно для Adobe Reader, чтобы забрать его с диска и загрузить его в память. Я обновил наш код, чтобы сгенерировать PDF следующим образом:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=whatever.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()                                

Обновление: я думал, что это работает, но, наверное, я говорил слишком рано. Я создал новый вопрос, который должен пройти через эту проблему.


Использовать content= "IE=edge,chrome=1" Пропустить другие режимы X-UA-Compatible

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
                                   -------------------------- 
  • Нет значка совместимости
    В адресной строке IE9 не отображается кнопка просмотра совместимости
    и на странице также не отображаются беспорядочные меню, изображения и текстовые поля.

  • Характеристики
    Этот метатег необходим для включения javascript::JSON.parse() в IE8
    (даже если присутствует <!DOCTYPE html> )

  • правильность
    Рендеринг / выполнение современных HTML / CSS / JavaScript более корректно (лучше).

  • Спектакль
    Механизм рендеринга Trident должен работать быстрее в своем краевом режиме.

использование

В вашем HTML

<!DOCTYPE html> 
<html> 
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  • IE=edge означает, что IE должен использовать последнюю (крайнюю) версию своего механизма рендеринга
  • chrome=1 означает, что IE должен использовать движок рендеринга Chrome, если он установлен

Или лучше в конфигурации вашего веб-сервера:
(см. также ответ RiaD )

  • Apache предложенный pixeline

    <IfModule mod_setenvif.c>
      <IfModule mod_headers.c>
        BrowserMatch MSIE ie
        Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
      </IfModule>
    </IfModule>
    <IfModule mod_headers.c>
      Header append Vary User-Agent
    </IfModule>
    
  • Nginx предложенный Stef Pause

    server {
      #...
      add_header X-UA-Compatible "IE=Edge,chrome=1";
    }
    
  • Varnish прокси, предложенный Лукасом Рютцелем

    sub vcl_deliver {
      if( resp.http.Content-Type ~ "text/html" ) {
        set resp.http.X-UA-Compatible = "IE=edge,chrome=1";
      }
    }
    
  • IIS (начиная с версии 7)

    <configuration>
      <system.webServer>
         <httpProtocol>
            <customHeaders>
               <add name="X-UA-Compatible" value="IE=edge,chrome=1" />
            </customHeaders>
         </httpProtocol>
      </system.webServer>
    </configuration>
    

Microsoft рекомендует режим Edge с IE11

Как заметил Lynda (см. Комментарии), изменения совместимости в IE11 рекомендуют режим Edge :

Начиная с IE11, режим edge - предпочтительный режим документа; он представляет собой самую высокую поддержку современных стандартов, доступных браузеру.

Но позиция Microsoft не ясна. Другая страница MSDN не рекомендовала режим Edge :

Поскольку режим Edge заставляет все страницы открываться в стандартном режиме, независимо от версии Internet Explorer, может возникнуть соблазн использовать это для всех страниц, просматриваемых в Internet Explorer. Не делайте этого, поскольку заголовок X-UA-Compatible поддерживается только с Windows Internet Explorer 8.

Вместо этого Microsoft рекомендовала использовать <!DOCTYPE html> :

Если вы хотите, чтобы все поддерживаемые версии Internet Explorer открывали ваши страницы в стандартном режиме, используйте объявление типа документа HTML5 [...]

Как поясняет Ricardo (в комментариях ниже) любой DOCTYPE (HTML4, XHTML1 ...) можно использовать для запуска режима стандартов, а не только для DOCTYPE HTML5. Важно всегда иметь DOCTYPE на странице.

Clara Onager даже заметил в более старой версии « Определение устаревших режимов документа» :

Режим Edge предназначен только для тестирования; не используйте его в производственной среде.

Это настолько запутанно, что Усман Я думал, что Клара Онагер говорила:

Пример [...] приведен только для иллюстративных целей; не используйте его в производственной среде.

<meta http-equiv="X-UA-Compatible" content="IE=7,9,10" >

Ну ... В оставшейся части этого ответа я даю больше объяснений, почему использование content="IE=edge,chrome=1" является хорошей практикой в ​​производстве.

история

В течение многих лет (с 2000 по 2008 год) доля рынка IE составляла более 80% . И IE v6 считался де-факто стандартом (доля на рынке с 80% до 97% в 2003 , 2004, 2005 и 2006 годах только для IE6, большая доля на рынке со всеми версиями IE).

Поскольку IE6 не уважал веб-стандарты , разработчикам приходилось тестировать свой веб-сайт с помощью IE6. Эта ситуация была отличной для Microsoft (MS), поскольку веб-разработчикам приходилось покупать продукты MS (например, IE нельзя использовать без покупки Windows), и было более выгодно оставаться несоответствующим (то есть Microsoft хотела стать стандартом, исключающим другие компании).

Поэтому многие сайты были совместимы только с IE6, и поскольку IE не соответствовал веб-стандарту, все эти веб-сайты не были хорошо отображены в браузерах, совместимых со стандартами. Хуже того, многие сайты требовали только IE .

Однако в это время Mozilla запустила разработку Firefox, в максимально возможной степени соблюдая все веб-стандарты (другой браузер был реализован для рендеринга страниц, как это сделал IE6). Поскольку все больше и больше веб-разработчиков хотели использовать новые функции веб-стандартов, все больше и больше веб-сайтов больше поддерживались Firefox, чем IE.

Когда доля рынка IE снижалась, MS поняла, что оставаться стандартным несовместимым не была хорошей идеей. Поэтому MS начала выпускать новую версию IE (IE8 / IE9 / IE10) в отношении все более и более веб-стандартов.

Веб-несовместимая проблема

Но проблема в том, что все веб-сайты, предназначенные для IE6: Microsoft не может выпускать новые версии IE, несовместимые с этими старыми веб-сайтами, разработанными IE6. Вместо того, чтобы выводить версию IE, веб-сайт был разработан, MS попросила разработчиков добавить дополнительные данные ( X-UA-Compatible ) на свои страницы.

IE6 по-прежнему используется в 2016 году

В настоящее время IE6 по-прежнему используется (0,7% в 2016 году) (4,5% в январе 2014 года), а некоторые интернет-сайты по-прежнему совместимы с IE6. Некоторые веб-сайты / приложения интрасети тестируются с использованием IE6. Некоторые веб-сайты интрасети на 100% работают только на IE6. Эти компании / отделы предпочитают откладывать затраты на миграцию: другие приоритеты, никто больше не знает, как реализован веб-сайт / приложение, владелец устаревшего веб-сайта / приложения обанкротился ...

Китай представляет 50% использования IE6 в 2013 году, но в ближайшие годы он может измениться по мере распространения китайского дистрибутива Linux .

Будьте уверены в своих веб-навыках

Если вы (попробуйте) уважать веб-стандарт, вы можете просто всегда использовать http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" . Чтобы поддерживать совместимость со старыми браузерами, просто не используйте последние веб-функции: используйте подмножество, поддерживаемое самым старым браузером, который вы хотите поддерживать. Или, если вы хотите пойти дальше, вы можете принять концепции, такие как грациозная деградация , прогрессивное улучшение и ненавязчивый JavaScript . (Вы также можете с удовольствием прочитать, что должен рассмотреть веб-разработчик .)

Не волнует лучшая рендеринг версии IE: это не ваша работа, поскольку браузеры должны соответствовать веб-стандартам. Если ваш сайт соответствует стандарту и использует умеренно последние функции, поэтому браузеры должны соответствовать вашему веб-сайту .

Более того, поскольку есть много кампаний, чтобы убить IE6 ( IE6 не более , кампания MS ), в настоящее время вы можете избежать траты времени на тестирование IE!

Персональный опыт IE6

В 2009-2012 годах я работал в компании, использующей IE6, как разрешен официальный единственный браузер . Я должен был внедрить сайт интрасети только для IE6. Я решил уважать веб-стандарт, но с помощью подпрограммы, поддерживающей IE6 (HTML / CSS / JS).

Это было сложно, но когда компания переключилась на IE8, веб-сайт все еще был хорошо отображен, потому что я использовал Firefox и firebug для проверки совместимости с веб-стандартом;)







internet-explorer pdf internet-explorer-8 https 64bit