Как обрабатывать специальные символы в nginx - PullRequest
1 голос
/ 05 июня 2019

, пожалуйста, помогите мне решить проблему.У меня есть 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 Ответ

1 голос
/ 05 июня 2019

Проблема возникает из оператора 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;, который может быть более эффективным и соответствовать реализации в предыдущем блоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...