Назад | Перейти на главную страницу

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

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

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

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

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

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

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

location /img {

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

}

думаю 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){