Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx 如何告诉gzip_static不要查找图像文件?_Nginx - Fatal编程技术网

Nginx 如何告诉gzip_static不要查找图像文件?

Nginx 如何告诉gzip_static不要查找图像文件?,nginx,Nginx,我安装了nginx,gzip_静态激活。它适用于CSS和JavaScript文件,但也适用于gzip版本的图像文件,如.png和.gif,尽管这些文件不在要压缩的文件列表中: # strace -p 25044 2>&1 | grep gz open("/var/www/css/ymax.css.gz", O_RDONLY|O_NONBLOCK) = 438 open("/var/www/images/tools.png.gz", O_RDONLY|O_NONBLOCK) = -1

我安装了nginx,gzip_静态激活。它适用于CSS和JavaScript文件,但也适用于gzip版本的图像文件,如.png和.gif,尽管这些文件不在要压缩的文件列表中:

# strace -p 25044 2>&1 | grep gz
open("/var/www/css/ymax.css.gz", O_RDONLY|O_NONBLOCK) = 438
open("/var/www/images/tools.png.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/images/ads/bs.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/images/gfxborder/border_right.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
open("/var/www/images/ads/hocuto03.gif.gz", O_RDONLY|O_NONBLOCK) = -1 ENOENT (No such file or directory)
以下是我的nginx配置:

gzip  on;
gzip_disable     "msie6";
gzip_min_length 1000;
gzip_types text/plain text/css application/x-javascript text/javascript;
gzip_static on;

有什么办法可以防止这种情况发生吗?

我找到了解决办法。事实上,有两种可能的解决方案:

  • 将javascript和CSS文件保存在单独的目录中,并创建“位置”规则,以便仅对该目录使用gzip_static

  • 如果这是不可能的(托管多个网站,而不是您控制下的所有内容,目录和文件太多),那么有一个更简单的解决方案可以通过使用缓存(即记住)不存在的.gz文件并且不再尝试再次打开它的设置来防止多个open()调用


  • 我找到了一种编辑nginx源代码的方法,但方法非常糟糕:

  • 查找文件:
  • ngx\u http\u gzip\u static\u module.c(1.0.1版,其他版本可能相同):

    2.在:

    ngx\u http\u gzip\u静态处理程序(ngx\u http\u请求\u t*r)

    3.发现:

    如果(r->uri.data[r->uri.len-1]=='/')){ 返回NGX_被拒绝; }

  • 加:
  • 如果(r->uri.data[r->uri.len-1]='g'&&r->uri.len-2]='n'&&r->uri.data[r->uri.len-3]='p'&&r->uri.data[r->uri.len-4]='{ 返回NGX_被拒绝; } 如果(r->uri.data[r->uri.len-1]='g'&&r->uri.len-2]='p'&&r->uri.data[r->uri.len-3]='j'&&r->uri.data[r->uri.len-4]='{ 返回NGX_被拒绝; } 如果(r->uri.data[r->uri.len-1]='o'&&r->uri.data[r->uri.len-2]='c'&&r->uri.data[r->uri.len-3]='i'&&r->uri.len-4]='{ 返回NGX_被拒绝; }

  • 重新编译源代码

  • 任何知道C的人都可以将其编辑得更加专业,因为我不知道C:(

    我发现了一种使用嵌套位置块的简单方法:

      location /assets {
        root   /usr/share/nginx/html;
        location ~ .*.(js|css|html|png)+$ {
          # Use for debugging
          # add_header 'X-static-gzipping' 'on' always;
          gzip_static on;
        }
      }