¿Cómo solucionar el problema de intercambio de imágenes en iOS 8 con keep-alive + HTTP Pipe-lining?

9

Desde iOS8, los sitios que administro experimentan un problema intermitente en el que las imágenes intercambian ubicaciones con otras imágenes. Esto se ha mencionado en varios lugares, pero sin una solución aparente:

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/

Parece que fue un problema en iOS5 en el pasado. Nuestro servidor ejecuta Lightspeed con revestimiento de tubería y keep-alive. El administrador de mi servidor ha confirmado que el revestimiento de tuberías devuelve activos en el orden en que fueron solicitados. Ha mencionado que deshabilitar keep-alive puede resolver el problema, pero aumentaría enormemente la carga del servidor, lo que sería algo realmente malo.

Todos mis activos también pasan correctamente la longitud del contenido.

Realmente estoy en un callejón sin salida ahora para una solución a esto. Con tantos de mis usuarios usando iOS, está comenzando a ser extremadamente frustrante para todos.

Solo comenzó a ocurrir con la introducción de iOS8, que tiene algunos cambios bastante pesados ​​en Safari. En cada versión, de 8, el problema sigue ahí. Como dije, es intermitente y nuestros usuarios comienzan a culparnos de que "ningún otro sitio tiene el problema".

Me preguntaba si alguien podría arrojar algo de luz sobre esto. ¿Alguien más ha experimentado este problema y / o ha encontrado una solución?

Aquí hay un enlace a mi sitio en cuestión.

David
fuente
Bienvenido a ServerFault David, ¿puede reducir este problema a quizás el html del sitio web? ¿O es esto específicamente un problema de Safari? No tengo un iPhone para probar, pero tal vez pueda indicar qué imágenes son lugares de intercambio, por lo que alguien aquí que no es lo suficientemente inteligente como para tener un Droid (broma) puede reproducir el problema. Además, intente instalar un navegador diferente en el teléfono y vea si se trata de un problema de Safari o de iOS.
MDMoore313
2
@BigHomie Es específico de Safari en iOS8. No parece ocurrir en Google Chrome. Y el problema no parece ocurrir en ninguna otra plataforma.
David
Hola ! Tengo muchas preguntas para ayudarlo a concentrarse en el problema real. ¿El problema ocurre en Safari OS X? ¿El problema ocurre en Safari iOS en un simulador? ¿Intentó abrir un enlace del inspector de Safari para verificar si los enlaces a las imágenes son correctos o si se trata de un problema de caché de Safari? Estas preguntas deberían llevarnos a la raíz del problema.
DeadEye
@DeadEye Estoy bastante seguro de que el problema solo ocurre en iOS 8. No estoy seguro de si sucede en un simulador y el inspector web no muestra nada inusual. De hecho, las imágenes vuelven con el nombre de archivo correcto a pesar de la imagen incorrecta. Mi mayor problema es que el informe de radar a Apple se cerró sin razón y openradar tampoco tiene nada de actividad a pesar de toda la información en los foros de discusión.
David
Si intenta ir directamente a la ruta de la imagen de una imagen intercambiada a través de Safari iOS, ¿es la imagen correcta?
DeadEye

Respuestas:

2

También tuvimos este problema y la solución para nosotros fue eliminar todas las etiquetas en nuestro HTML y usar clases css con propiedades de fondo. Aquí hay un ejemplo:

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

Se siente un poco incómodo, lo sé, pero esta fue la única forma de resolver el problema para nosotros. Un inconveniente es que tuvimos que eliminar el "alt" para las imágenes, pero supongo que puede resolverlo con algunos JavaScript si es necesario.

¡Espero que esto ayude!

Mikael Lundberg
fuente
2

Estaba lidiando con este problema en un nuevo sitio web que acabamos de lanzar. Todo se veía bien en FF / Opera / Chrome, etc., pero tuve problemas PRINCIPALES de intercambio de imágenes en iOS8 +. Noté que muchos de los sitios que informan este problema ejecutan el servidor web Litespeed. Me cambié a Apache por un momento para probar, y efectivamente, el sitio web se cargó bien. Mi host (wiredtree.com, excelente servicio) y yo miramos algunas de las opciones de configuración en Litespeed, y deshabilité estas dos opciones:

  • Habilitar la compresión
  • Habilitar compresión dinámica

Después de deshabilitar esos dos, los sitios web se cargaron sin problemas. Tuvo un golpe de rendimiento muy leve, pero definitivamente valió la pena.

Al principio, intentamos deshabilitar keep-alive para deshabilitar efectivamente la canalización HTTP, pero no resolvió el problema. Lo anterior es lo único que he visto que ofrece una solución real.

¡Espero que esto pueda ayudar a alguien a lidiar con los mismos problemas!

Kevin
fuente
1

No es una respuesta, sino un enfoque para resolver el problema:

  1. Reproduzca el problema por su cuenta utilizando una versión de desarrollo de la aplicación utilizando los servidores web en producción. Solo asegurándome de cubrir eso.
  2. Cree una nueva entrada de nombre de host / CNAME y el host virtual correspondiente en el servidor web, o si es necesario para el paso 3, un servidor HTTP separado en un puerto separado. Esto se conoce como el "servidor HTTP de prueba"
  3. Apunte su versión de prueba / desarrollo a este nuevo servidor HTTP y reproduzca el problema. ¡No vaya al paso 4 hasta que pueda hacer esto!
  4. Ahora en este servidor HTTP de prueba, ya sea a través de redireccionamientos o configuración inteligente (como sea posible con Apache), deshabilite keepalives, compresión, https, almacenamiento en caché, canalización y cualquier otra cosa que se le ocurra. Reproduzca el problema y tome nota de todas las tuplas de configuración que hacen esto y las que no.
  5. Intercambie el servidor Litespeed con Apahce. De nuevo, debería ser bastante trivial para un buen administrador de sistemas. ( ejem ) Reproducir problema.

Si puede reproducir el problema hasta el paso 5, y ningún conjunto de cambios de configuración o cambios en el software del servidor marcan la diferencia, el problema es iOS y probablemente nada que pueda hacer. (Pero esto es poco probable).

Sin embargo, si hay un conjunto de cambios de configuración que no depende de Litespeed (es decir, también ocurre con Apache), entonces podemos hacer una solución: use las BrowserMatchdirectivas para detectar el (conjunto de) navegadores en particular; establezca los parámetros de configuración para este conjunto de BrowserMatch. Encontrarás ejemplos de este tipo de cosas que se remontan a los navegadores IE 3.0 y Netscape.

Si el problema resulta ser Litespeed, use el enfoque anterior y presente un error con el soporte de Litespeed. Estás pagando por el apoyo, ¿no?

Oteo
fuente
1

El uso del protocolo http / 2 parece haber resuelto el problema en mi caso. Pero, estoy seguro de que podría haber una solución / solución real para este problema.

David
fuente