Nginx 设置rewrite规则是遇到的一个{}大括号引发的报错问题

时间:2022-08-03 23:57:54

一个群友提到:

用nginx image_filter模块裁图,用!拼宽高能够实现,现在想用参数传宽高总是报错,配置如下:

 

location ~ ^/images/.* {

    if ( $query_string ~ "w=(\d+)&h=(\d+)" ) {

        set $w $1;

        set $h $2;

        rewrite "/images/(.*)" ${uri}!${w}x${h} last;

    }

}

location ~* ^/images/(.*)!(\d+)x(\d+) {

    set $w $2;

    set $h $3;

    image_filter_jpeg_quality 50;

    image_filter resize $w $h;

    image_filter_buffer 10M;

    try_files /images/$1  404;

}

 

在使用这个rewrite规则的时候 主要是想通过query_string传宽和高,通过uri传递是没有问题的。但是报错。

nginx: [emerg] directive "rewrite" is not terminated by ";"

 

然后有其他群友点到:

猜测是引号的问题,加个引号试试

测试了一下,加双引号就好了~

Nginx 设置rewrite规则是遇到的一个{}大括号引发的报错问题

 

我顺带google了下原因,在使用 rewrite "/images/(.*)" ${uri}!${w}x${h} last;    这段时,你是想表达变量,但是{} 被解析成规则的起始和结束标记,为了安全起见 需要带上引号

 

其他讨论:

刚开始用nginx的时候坑过几次,空间快满了,rm掉 nginx的log~~ 结果空间释放不出来。。最后要 lsof 才能发现问题~~

其他建议:

location ~* /img/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ {           
    set $h $2;
    set $w $3;
    if ($h = "0") {
        rewrite /img/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /img/$1.$4 last;
    }
    if ($w = "0") {
        rewrite /img/(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ /img/$1.$4 last;
    }
    #根据给定的长宽生成缩略图
    image_filter resize $h $w;
    #原图最大2M,要裁剪的图片超过2M返回415错误,需要调节参数image_filter_buffer
    image_filter_buffer 2M;                         
    #error_page  415              /img/notfound.jpg;
    try_files /img/$1.$4  /img/notfound.jpg;   
}

location ~* /img {
}

这个rewrite规则作为参考。