Назад | Перейти на главную страницу

Nginx x-Accel удаляет заголовок Content-Encoding

У меня есть настройка сервера Nginx, позволяющая обрабатывать запросы с помощью X-Accel-Redirect заголовок. Это отлично работает для изображений, но я пытаюсь заставить его работать для файлов Javascript, которые уже заархивированы на диске, и, похоже, Nginx удаляет Content-Encoding заголовок. Это заставляет браузер не разархивировать содержимое при его получении, что, очевидно, не позволяет ему работать.

Как я могу обслуживать предварительно сжатый контент через X-Accel-Redirect ?

Видны следующие заголовки:

С Accel = не работает

Accept-Ranges:bytes
Cache-Control:max-age=1209600, s-maxage=120960
Connection:keep-alive
Content-Length:122871
Content-Type:application/javascript
Date:Mon, 24 Jun 2013 13:44:36 GMT
Expires:Mon, 08 Jul 2013 13:44:36 GMT
Last-Modified:Mon, 24 Jun 2013 13:38:20 GMT
Server:nginx/1.2.8

Нет ускорения = работает

Cache-Control:max-age=1209600, s-maxage=120960
Connection:keep-alive
Content-Encoding:gzip
Content-Length:122871
Content-Type:application/javascript
Date:Mon, 24 Jun 2013 13:45:08 GMT
Expires:Mon, 08 Jul 2013 13:45:08 GMT
HTTP1/0 200 Ok:
Pragma:cache
Server:nginx/1.2.8
X-Powered-By:PHP/5.4.9

Если это актуально, код, обслуживающий контент:

public static function  proxyFile($fileNameToServe, $mimeType, $alreadyGzip = false){
        $seconds_to_cache = 3600 * 24 * 7 * 2; 

        $filesize = filesize($fileNameToServe);
        header('Content-Length: '.$filesize);

        if ($alreadyGzip) {
            header('Content-Encoding: gzip');
        }

        if(defined('X-ACCEL-REDIRECT') == true && constant('X-ACCEL-REDIRECT') == true){
            $filenameToProxy = str_replace(PATH_TO_ROOT."var/cache", '/protected_files', $fileNameToServe );
            sendProxyHeaders($mimeType, $seconds_to_cache);
            header("X-Accel-Redirect: ".$filenameToProxy);
            exit(0);
        }
        else{
            sendProxyHeaders($mimeType, $seconds_to_cache);
            $fileHandle = fopen($fileNameToServe, 'r');

            if($fileHandle == false){
                throw new \Exception("Failed to open file [$fileNameToServe] for serving.");
            }

            while (!feof($fileHandle)) {
                $contents = fread($fileHandle, 8192);
                echo $contents;
            }

            fclose($fileHandle);
        }

        exit(0);
    }

Я пробовал установить proxy_pass_header Content-Encoding; но, видимо, это не действует.

Похоже, есть два решения:

  1. Скажите Nginx передать заголовок Content-Encoding add_header Content-Encoding $upstream_http_content_encoding;и отключите gzip для местоположения x-Accel-Redirect, чтобы предотвратить двойное сжатие содержимого.

    расположение ^ ~ / protected_files {gzip off; внутренний; псевдоним / home / intahwebz / var / cache; add_header Content-Encoding $ upstream_http_content_encoding; }

  2. Включите gzip_static модуль.

Перед передачей файла с диска клиенту с поддержкой gzip этот модуль будет искать предварительно сжатый файл в том же месте, которое заканчивается на ".gz". Цель состоит в том, чтобы не сжимать один и тот же файл при каждом запросе.