Я хочу получить динамические 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 ошибочных страниц?
Вы неправильно поняли переменную $ 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;
}
}
Я думаю 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){