Hello!

On Mon, Feb 19, 2018 at 06:18:52PM +0300, CoDDoC wrote:

> Доброе время суток!
> 
> Есть такой локейшен:
> location ~ "^/img/" { internal; }
> 
> Естественно, прямой запрос 'GET /img/file.jpg' получает 404
> Все хорошо, но нужно вместо стандартной nginx страницы отдать кастомную.
> Можно решать разными способами, я решил попробовать через 'return 404 <text>' 
> (минимум внутренних реврайтов/редиректов).
> 
> Получилось так (упрощенно):
> 
> error_page 404 = @err404;
> location @err404 {
>       return 404 '<!DOCTYPE html> <html> <body> <h1> <center> WTF ? </center> 
> </h1> </body> </html>';
>       add_header "Content-Type" "text/html; charset=UTF-8" always;
> }
> 
> Оно работает, одно смущает: дублирование заголовка Content-Type: сперва 
> 'image/jpeg', затем уже 'text/html; charset=UTF-8'
> Браузер-то, ясное дело, возьмет по итогу второй заголовок. Но, может, есть 
> какой-либо цивилизованный способ оставить один Content-Type без прикручивания 
> костыля типа headers-more ?

Правильно - не пытаться прибить левый Content-Type гвоздями с 
помощью add_header, а задать его штатными средствами.  Например 
так:

    error_page 404 = /error404.html;
    location = /error404.html {
        charset utf-8;
        return 404 '<!DOCTYPE html> ...';
    }

Или, если по каким-то причинам очень хочется именно именованный 
location, то так:

    error_page 404 = @err404;
    location @err404 {
        types {}
        default_type text/html;
        charset utf-8;
        return 404 '<!DOCTYPE html> ...';
    }

-- 
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить