如何在Nginx中处理特殊符号

时间:2019-06-05 13:44:25

标签: ubuntu nginx

请帮助我解决此问题。我有调整拇指大小的Nginx。我的问题是当我请求名称中带有符号的图像时,出现错误。例如,如果我请求:

http://example.com/thumbs/_default_upload_bucket/75/75/test+.jpg

然后我得到错误415 Unsupported Media Type.并且在错误日志中我看到

[error] 509#509: *62531 open() "/var/www/html/assets/_default_upload_bucket/test%2B.jpg" failed (2: No such file or directory)

为什么会这样,我该如何解决。这是我的nginx配置。请帮我。谢谢。

location ~* /thumbs/(.*)/(\d+)/(\d+)/(.*)$ {
            set $bucket $1;
            set $width $2;
            set $height $3;
            set $filename $4;
    try_files /$1/$2/$3/$4 @images;
    root /var/www/html/tmp/image-thumbnails;
    expires 2w;
    access_log off;
}


location @images {
            root /var/www/html/assets/;
            rewrite ^.*$ /$bucket/$filename break;
            image_filter_buffer 50M;
            image_filter resize $width $height;
}

1 个答案:

答案 0 :(得分:1)

该问题似乎源于set $filename $4;语句。 $filename变量变为URL编码,这阻止Nginx查找正确的文件。

您可以通过使用命名捕获来避免使用set指令。

例如:

location ~* /thumbs/(?<bucket>.*)/(?<width>\d+)/(?<height>\d+)/(?<filename>.*)$ {
    try_files /$1/$2/$3/$4 @images;
    ...
}
location @images {
    rewrite ^.*$ /$bucket/$filename break;
    ...
}

作为rewrite...break的替代方法,您还可以使用try_files /$bucket/$filename =404;,它可能更有效,并且与上一个块中的实现相匹配。