Nginx x-accel 剥离 Content-Encoding 标头

Nginx x-accel 剥离 Content-Encoding 标头

我的 Nginx 服务器设置允许使用X-Accel-Redirect标头来处理请求。这对于图像来说很有效,但我试图让它适用于已经在磁盘上 gzip 压缩的 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

似乎有两个解决方案:

  1. 告诉 Nginx 传递 Content-Encoding 标头add_header Content-Encoding $upstream_http_content_encoding;,并关闭 x-accel-redirect 位置的 gzip,以防止内容被 gzip 压缩两次。

    位置 ^~ /protected_files { gzip 关闭;内部;别名 /home/intahwebz/var/cache;add_header Content-Encoding $upstream_http_content_encoding; }

  2. 启用gzip_static模块。

在将文件从磁盘提供给启用 gzip 的客户端之前,此模块将在同一位置查找以“.gz”结尾的预压缩文件。目的是避免每次请求时都压缩相同的文件。

相关内容