Ubuntu 如何处理nginx中的特殊符号

Ubuntu 如何处理nginx中的特殊符号,ubuntu,nginx,Ubuntu,Nginx,请帮我解决这个问题。我有一个可以调整拇指大小的nginx。我的问题是,当我请求名称中带有符号的图像时,我得到了错误。例如,如果我请求: http://example.com/thumbs/_default_upload_bucket/75/75/test+.jpg 然后我得到错误415不支持的媒体类型。在错误日志中我看到 [error] 509#509: *62531 open() "/var/www/html/assets/_default_upload_bucket/test%2B.jpg

请帮我解决这个问题。我有一个可以调整拇指大小的nginx。我的问题是,当我请求名称中带有符号的图像时,我得到了错误。例如,如果我请求:

http://example.com/thumbs/_default_upload_bucket/75/75/test+.jpg
然后我得到错误
415不支持的媒体类型。
在错误日志中我看到

[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;
}

问题似乎源于
设置$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;
    ...
}
location~*/thumbs/(?.*)/(?\d+)/(?\d+)/(?.*)${
try_files/$1/$2/$3/$4@images;
...
}
位置@图像{
重写^.*$/$bucket/$filename break;
...
}

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

问题似乎源于
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;
    ...
}
location~*/thumbs/(?.*)/(?\d+)/(?\d+)/(?.*)${
try_files/$1/$2/$3/$4@images;
...
}
位置@图像{
重写^.*$/$bucket/$filename break;
...
}
作为
rewrite…break
的替代方法,您还可以使用
try_files/$bucket/$filename=404这可能更有效,并且与上一块中的实现匹配