3

nginx 用try_files 时,gzip_static不起作用,如何解决

 2 months ago
source link: https://blog.p2hp.com/archives/11794
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

nginx 用try_files 时,gzip_static不起作用,如何解决

nginx 用try_files 时,gzip_static不起作用,如何解决

当使用try_files指令时,gzip_static指令可能不会起作用的原因是,try_files指令会绕过gzip_static的处理。为了解决这个问题,您可以尝试以下两种方法:

使用if指令:
在try_files指令之前添加一个if指令,用于检查请求的文件是否存在。如果存在,可以手动添加.gz扩展名,并使用gzip_static指令来处理:

location / {
if (-f $request_filename.gz) {
add_header Content-Encoding gzip;
rewrite ^(.*)$ $1.gz break;
}
try_files $uri $uri/ =404;
}
这样,当请求的文件存在并且有对应的.gz压缩文件时,gzip_static指令将会生效。

使用map指令:
可以使用map指令来创建一个映射,将请求的文件名与对应的.gz文件名关联起来,并在try_files指令中使用该映射进行处理:

map $uri $gzip_file {
default "";
~^(?<path>.+)\.(?<ext>[^.]+)$ $path.$ext.gz;
}

server {
...

location / {
try_files $uri$gzip_file $uri $uri/ =404;
}
}
这样,当请求的文件存在并且有对应的.gz压缩文件时,try_files指令将会根据映射的结果进行处理。

请注意,使用if指令可能会引发一些性能和安全方面的问题,因此建议使用map指令的方式来解决这个问题。同时,确保已经在nginx.conf中启用了gzip_static指令.

注:笔者使用

location / {
if (-f $request_filename.gz) {
add_header Content-Encoding gzip;
rewrite ^(.*)$ $1.gz break;
}
try_files $uri $uri/ =404;
}

验证通过.没有发现性能问题.所以推荐使用

location / {
if (-f $request_filename.gz) {
add_header Content-Encoding gzip;
rewrite ^(.*)$ $1.gz break;
}
try_files $uri $uri/ =404;
}

方式..

================
GTP4:(未验证)
nginx 用try_files 时,gzip_static不起作用,如何解决

这可能是由于 gzip_static 指令的工作方式。gzip_static 指令会尝试为请求的文件提供预先压缩的版本。例如,如果你请求 /static/js/main.js,Nginx 会在文件系统中寻找 /static/js/main.js.gz,如果找到了,就直接发送这个文件。

如果你使用 try_files 指令,Nginx 可能会在找到一个有效文件之前,就已经尝试使用 gzip_static 了。例如,如果你的配置是这样的:

location / {
try_files $uri $uri/ /index.html;
gzip_static on;
}
那么当你请求 /static/js/main.js 时,Nginx 首先会尝试找 /static/js/main.js,然后尝试 /static/js/main.js/,最后尝试 /index.html。在这个过程中,gzip_static 可能会在找到 /index.html 之前就已经尝试过了。

要解决这个问题,你可以尝试将 gzip_static 指令放在一个单独的 location 块中,这样它只会对特定的请求生效。例如:

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

location /static/ {
gzip_static on;
}
在这个配置中,只有请求以 /static/ 开头的文件时,gzip_static 才会生效。

另外,请确保你已经生成了预先压缩的 .gz 文件,并且 Nginx 有足够的权限访问这些文件。你可以使用 gzip 命令来生成这些文件,例如 gzip -k /path/to/your/file。

希望这个答案能够帮到你!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK