我的 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
似乎有两个解决方案:
告诉 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; }
启用gzip_static模块。
在将文件从磁盘提供给启用 gzip 的客户端之前,此模块将在同一位置查找以“.gz”结尾的预压缩文件。目的是避免每次请求时都压缩相同的文件。