Safari for OSX, iOS, and Windows is having issues decompressing Gzip content on my server after a recent server overhaul.

I moved from 1 server with Apache and PHP5-FPM to 3 servers. A load balancer and two servers running HHVM, all using Nginx.

I cannot determine what causes the decompression issue. It happens consistently on the same documents, but inconsistently throughout the website.

This thread loads fine.

This thread does not.

What I receive instead on Safari is content that looks like this.

����z�H�6xl]E6�//S�.j�Ey��]���r�����H�$J �@-]����%̥͕���@)R�$چ�,a�-22222ތÿ<����^�Q4v����p���?l���%�Zް]�����%�w�v����%�s�0l�>L�����_B����vp�������ہx��v������ݵ���{n� ���W;��^���bd��|׵&�����!=@j�{��-���;    ��Gܫ�Q���?�V�   �:�]�v�)&�Ж׍�8�^�p�m�FQ4yX����UV����I�珫�Zm�:���¶�G[[[w]�*F�=h��ձu��{���(�&tCi���3;��vu�ҬԪ�0L=��|�%�n�R%ÑmG%QE��b(��2�}�͚8!������q/��'���G

This only happens in Safari.

Chromium? Works. Google Chrome? Works. IE10? Works. Mozilla? Works. Opera? Works. IceWeasle? Works. Android Chrome? Works. Dolphin Browser? Works.

I've enabled debugging in Safari. Here are the response headers.

Safari for Windows

Cache-Control:private, max-age=0
Content-Encoding:gzip, gzip
Content-Type:text/html; charset=UTF-8
Date:Sat, 01 Aug 2015 15:39:27 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Vary:Accept-Encoding, Accept-Encoding

For contrast, here is Chromium, which works.

Chromium (Working)

cache-control:private, max-age=0
content-type:text/html; charset=UTF-8
date:Sat, 01 Aug 2015 15:40:05 GMT
expires:Thu, 19 Nov 1981 08:52:00 GMT
status:200 OK

This is the exact same document. The only difference appears to be that Safari sends "keep-alive", which is not present in Chromium. Maybe this is why it never decompresses? It never stops waiting for more gzip stuff?

Nginx config for Gzip. This applies to all three servers (both load balancer and nodes)

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 32 8k;
    gzip_http_version 1.1;
    gzip_types text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    proxy_buffering off;

Additionally, here is the load config.

    upstream fruitbasket {
            server lime:443 weight=10;
            server lemon:443 weight=3;

I have tried every conceivable configuration to fix this but nothing has helped.

Edit 1: After looking through the response headers of all other browsers, the Keep-Alive I mentioned was not found in any of them.

Edit 2: I can confirm that the issue is Content-Encoding:gzip, gzip. Any page with a single gzip loads. Safari doesn't know what to do with this encoding type.

  • Why does it say Content-Encoding: gzip, gzip. My server says gzip only once. Please don't use Safari for Windows, it's old as #%^* and won't give a good representation of what Safari on iOS or OS X will do. – jornane Aug 1 '15 at 16:40
  • @jornane gzip,gzip is what's breaking Safari, though you didn't read the first sentence in my message. iOS Safari, Macintosh Safari, and Windows Safari are all breaking on these specific pages that send in the double gzip. – Null Aug 1 '15 at 16:43
  • Well, I can confirm Safari doing that, but I don't know why your server sent it twice. I don't think Keep-Alive has anything to do with this. Did you check if there isn't any redundant directive to set the gzip header? – jornane Aug 1 '15 at 16:53

My issue was specific. XenForo features automatic gzip as an application-level config option. If you are having this issue, make sure that your application does not also gzip before it reaches your server.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.