Как исправить проблему обмена изображениями в iOS 8 с помощью keep-alive + HTTP конвейерной разметки?

9

Начиная с iOS8, сайты, которыми я управлял, испытывают периодическую проблему, при которой изображения меняются местами с другими изображениями. Это было упомянуто во многих местах, но без очевидного решения:

https://discussions.apple.com/thread/6574663

http://tech.vg.no/2011/12/14/safari-on-ios-5-randomly-switches-images/

http://tech.vg.no/2012/02/01/safari-on-ios-5-randomly-switches-images-part-3/

кажется, это было проблемой в iOS5 в прошлом. Наш сервер работает на Lightspeed с конвейерной облицовкой и поддержкой активности. Администратор моего сервера подтвердил, что конвейер возвращает ресурсы в том порядке, в котором они были запрошены. Он упомянул, что отключение поддержки активности может решить проблему, но значительно увеличит нагрузку на сервер, что было бы очень плохо.

Все мои активы тоже правильно передают контент-длину.

Я действительно в тупике для решения этой проблемы. Так как многие из моих пользователей используют iOS, это начинает вызывать большое разочарование у всех.

Это только начало происходить с появлением iOS8, которая имеет довольно серьезные изменения в Safari. В каждом выпуске из 8 проблема все еще существует. Как я уже сказал, это периодически, и наши пользователи начинают обвинять нас, поскольку «ни у какого другого сайта нет проблемы».

Мне было интересно, если кто-нибудь может пролить свет на это? Кто-нибудь еще сталкивался с этой проблемой и / или нашел решение?

Вот ссылка на мой сайт в вопросе.

Дэвид
источник
Добро пожаловать в ServerFault Дэвид, вы можете сузить эту проблему до, возможно, HTML-сайт? Или это проблема Safari? У меня нет iPhone для тестирования, но, возможно, вы можете указать, какие изображения являются местами для обмена, поэтому кто-то здесь, кто не достаточно сообразителен, чтобы иметь Droid (шутка), может воспроизвести проблему? Кроме того, попробуйте установить на телефоне другой браузер и посмотреть, является ли это проблемой Safari или iOS.
MDMoore313
2
@ BigHomie Это специфично для Safari на iOS8. Похоже, это не происходит в Google Chrome. И проблема не возникает на любой другой платформе.
Дэвид
Привет ! У меня много вопросов, чтобы помочь вам сосредоточиться на реальной проблеме. Проблема возникает в Safari OS X? Возникает ли проблема в Safari iOS в симуляторе? Вы пытались открыть ссылку инспектора Safari, чтобы проверить правильность ссылок на изображения или проблему с кешем Safari? Эти вопросы должны привести нас к корню проблемы.
DeadEye
@DeadEye Я уверен, что проблема возникает только в iOS 8. Я не уверен, что это происходит в симуляторе, и веб-инспектор не показывает ничего необычного. На самом деле изображения возвращаются с правильным именем файла, несмотря на неправильное изображение. Моя самая большая проблема заключается в том, что отчет радара Apple был закрыт без причины, и openradar также не имеет к этому никакого отношения, несмотря на всю информацию на дискуссионных форумах.
Дэвид
Если вы попытаетесь перейти непосредственно в путь к изображению для замененного изображения через Safari iOS, это правильное изображение?
DeadEye

Ответы:

2

У нас также была эта проблема, и решением для нас было удалить все теги в нашем HTML и использовать вместо этого классы css со свойством background. Вот пример:

.img_logo {
  background: url(../images/logo.png?v=20150427) no-repeat;
  width: 175px;
  height: 49px;
  display: block;
}

Я чувствую себя немного неловко, я знаю, но это был единственный способ решить эту проблему для нас. Одним из недостатков является то, что нам пришлось убрать «alt» для изображений, но я думаю, что вы можете решить это с помощью некоторого JavaScript, если это необходимо.

Надеюсь это поможет!

Микаэль Лундберг
источник
2

Я занимался этим вопросом на новом веб-сайте, который мы только что запустили. Все выглядело хорошо в FF / Opera / Chrome и т. Д., Но у меня были ОСНОВНЫЕ проблемы с заменой изображений в iOS8 +. Я заметил, что на многих сайтах, сообщающих об этой проблеме, работает веб-сервер Litespeed. Я переключился на Apache на некоторое время, чтобы проверить, и, конечно же, веб-сайт загрузился очень хорошо. Мой хост (wiredtree.com, отличный сервис) и я просмотрели некоторые параметры конфигурации в Litespeed и отключили эти два параметра:

  • Активировать сжатие
  • Включить динамическое сжатие

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

Сначала мы пытались отключить keep-alive, чтобы эффективно отключить HTTP Pipelining, но это не решило проблему. Вышесказанное - единственное, что я видел, предлагая реальное решение.

Надеюсь, это может помочь кому-то, имеющему дело с теми же проблемами!

Kevin
источник
1

Не ответ, а подход к решению проблемы:

  1. Воспроизведите проблему самостоятельно, используя версию приложения для разработки, используя производственные веб-серверы. Просто убедись, что ты прикрыл это.
  2. Создайте новую запись hostname / CNAME и соответствующий виртуальный хост на веб-сервере или, если необходимо, на шаге 3, отдельный HTTP-сервер на отдельном порту. Это известно как «тестовый HTTP-сервер»
  3. Направьте вашу тестовую / разрабатываемую версию на этот новый HTTP-сервер и воспроизведите проблему. Не переходите к шагу 4, пока не сможете это сделать!
  4. Теперь на этом тестовом HTTP-сервере через перенаправления или интеллектуальную настройку (насколько это возможно с Apache) отключите keepalive, сжатие, https, кеширование, конвейеризацию и все, что только можно придумать. Воспроизведите проблему и запишите все конфигурации, которые делают это, и те, которые этого не делают.
  5. Поменяйте местами сервер Litespeed с Apahce. Опять же, должно быть довольно тривиально для хорошего системного администратора. ( хм ). Воспроизвести проблему.

Если вы можете воспроизвести проблему на протяжении всего шага 5, и никакие изменения конфигурации или серверного программного обеспечения не имеют значения, проблема заключается в iOS и, вероятно, вы ничего не можете сделать. (Но это вряд ли.)

Однако, если есть набор изменений конфигурации, который не зависит от Litespeed (то есть происходит также с Apache), то мы можем обойти это: использовать BrowserMatchдирективы для обнаружения определенных (набор) браузеров; установить параметры конфигурации для этого набора BrowserMatch. Вы найдете примеры такого рода вещей, начиная с браузеров IE 3.0 и Netscape.

Если проблема оказывается в Litespeed, используйте описанный выше подход и сообщите об ошибке с поддержкой Litespeed. Вы платите за поддержку, не так ли?

Otheus
источник
1

использование протокола http / 2, похоже, решило проблему в моем случае. Но я уверен, что может быть реальное решение этой проблемы.

Дэвид
источник