NGINX Serve无源预压缩索引文件

tkqqtvp1  于 2023-02-21  发布在  Nginx
关注(0)|答案(2)|浏览(143)

我发现了一个有趣的问题。
我尝试使用NGINX的gzip_static模块来提供一些没有源代码的gzip文件(我知道这样做的缺点),这意味着您可以在服务器上使用transfer-encoding来提供gzip文件:例如,如果有一个文件/foo. html. gz,则对/foo. html的请求将使用内容编码的压缩文件:文本/html。
虽然这通常是可行的,但事实证明,当在目录中查找索引文件时,gzip版本不会被考虑。

GET /index.html
200

GET /
403

我想知道是否有人知道如何解决这个问题。我尝试将index.html.gz设置为索引文件,但它是作为一个gzip文件,而不是gzip编码的html文件。

ttcibm8c

ttcibm8c1#

很明显这样行不通。
这是模块source的一部分:

if (r->uri.data[r->uri.len - 1] == '/') {
     return NGX_DECLINED;
 }

因此,如果uri以斜杠结尾,它甚至不会查找gzip版本。
但是,你可能可以使用rewrite来破解。(这是一个猜测,我还没有测试过)

rewrite ^(.*)/$ $1/index.html;

编辑:要使它与autoindex(guess)一起工作,可以尝试使用以下代码而不是重写:

location ~ /$ { 
    try_files ${uri}/index.html $uri;
}

总的来说,它可能比重写更好。但是你需要尝试...

9wbgstp7

9wbgstp72#

你可以准备好你的预压缩文件然后发送它。下面的文件是由PHP准备的,并且不需要检查客户端是否支持gzip。

// PHP prepare the precompressed gzip file
file_put_contents('/var/www/static/gzip/script-name.js.gz', gzencode($s, 9));
// where $s is the string containing your file to pre-compress
// NginX serve the precompressed gzip file
location ~ "^/precompressed/(.+)\.js$" {
    root /var/www;
    expires 262144;
    add_header Content-Encoding gzip;
    default_type application/javascript;
    try_files /static/gzip/$1.js.gz =404;
}
# Browser request a file - transfert 113,90 Kb (uncompressed size 358,68 Kb)
GET http://inc.ovh/precompressed/script-name.js

# Response from the server
Accept-Ranges bytes
Cache-Control max-age=262144
Connection keep-alive
Content-Encoding gzip
Content-Length 113540
Content-Type application/javascript; charset=utf-8
ETag "63f00fd5-1bb84"
Server NginX

相关问题