首页 > 解决方案 > 如何处理 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;
}

标签: ubuntunginx

解决方案


问题似乎源于该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;它可能更有效并与前一个块中的实现相匹配。


推荐阅读