Я хочу получить динамический ответ 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){