У меня есть настройка сервера Nginx, позволяющая обрабатывать запросы с помощью X-Accel-Redirect
заголовок. Это отлично работает для изображений, но я пытаюсь заставить его работать для файлов Javascript, которые уже заархивированы на диске, и, похоже, Nginx удаляет Content-Encoding
заголовок. Это заставляет браузер не разархивировать содержимое при его получении, что, очевидно, не позволяет ему работать.
Как я могу обслуживать предварительно сжатый контент через X-Accel-Redirect
?
Видны следующие заголовки:
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;
но, видимо, это не действует.
Похоже, есть два решения:
Скажите 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; }
Включите gzip_static модуль.
Перед передачей файла с диска клиенту с поддержкой gzip этот модуль будет искать предварительно сжатый файл в том же месте, которое заканчивается на ".gz". Цель состоит в том, чтобы не сжимать один и тот же файл при каждом запросе.