использование nginx переписывает как динамические 404 изображения

Я хочу получить динамические 404 ответа в зависимости от требуемого URL:

foo.jpg не существует

http://example.com/img/style/thumbnail/foo.jpg  

должен показать

http://example.com/img/notfound/thumbnail.jpg  

с 404 состояниями заголовка

Я разобрался в части перезаписи, но я, может казаться, не получаю ее возврат с 404 кодами состояния.
Я попробовал это следующим кодом, но без успеха:

location ~ /img {
    if (!-f $request_filename){
            rewrite "^(.*img\/)style\/([a-zA-Z\_\-[0-9]*)\/?(.+)" $1notfound/$2.jpg;
            #so far so good. Now i want to return the rewrite result as a 404 response
            error_page 404 = $request_filename;
            return 404;
    }
}

Это дает мне ошибочную страницу nginx 404 по умолчанию вместо переписанного URL с 404 кодами состояния. Как я могу сказать nginx использовать переписать результат в качестве 404 ошибочных страниц?

0
задан 24 September 2014 в 13:19
2 ответа

Вы неправильно поняли переменную $ request_filename . Он представляет собой физический путь , сопоставленный с файлом с учетом значений директив root и alias и текущего обрабатываемого URI.

Таким образом, ваша директива error_page будет внутренне перенаправлять на URI, соответствующий физический путь, который не существует, так как он совпадает с путем, который был протестирован для входа в ваш блок if.

Оператор = в директиве error не является проблемой, он просто сообщает nginx о необходимости сохранить текущий код ошибки как есть. Вы также экранируете некоторые символы в вашем регулярном выражении, которые вам не нужны, и это ухудшает читаемость.

Итак, ваш блок if делает именно то, что блоки местоположения делают с регулярными выражениями.

Вы можете просто сократить это до:

location /img {

    location ~ ^/img/style/([_-a-zA-Z0-9]*) {
        error_page 404 /img/notfound/$1.jpg;
    }

}
4
ответ дан 4 December 2019 в 11:27

Я думаю error_page 404 = $ request_filename;

должно быть

error_page 404 $ request_filename;

согласно документации ngx_http_core_module

Если ваш файл не существует, он должен возвращать значение по умолчанию 404, а не 200.

Просто скажите nginx, чтобы он возвращал этот файл для всех ошибок 404.

Этот код следует разместить над условным условием и в блоке местоположения:

location ~ /img {
    error_page 404 /srv/www/static/img/notfound.jpg;

    if (!-f $request_filename){
1
ответ дан 4 December 2019 в 11:27

Теги

Похожие вопросы