nginx почему выдает ошибку 400 когда должен выдавать 404!

Значит есть такой конфиг nginx:

server {
    listen      1.1.1.1:80;
    server_name site.ru www.site.ru;
    
    error_log    /var/log/site.ru.error.log error;
    access_log   /var/log/site.ru.log combined;
    
    set $root_path  /home/user/site;

    location / {
        proxy_pass      http://1.1.1.1:8080;
        # ... параметры
    }
    
    location = /favicon.ico {
        root          ${root_path}/img;
        access_log    off; 
        expires       max;
        # try_files     $uri =404;   # не понятно надо ли, похоже нет! не обязательно!
    }
 
    # запрещеные  папки и урлы
    location ~* /\.sv     { return 400; }
    location ~* /\.ht     { return 400; }
    location ~* /\.[\w]+  { return 400; }
    location ~* /cgi      { return 400; }
    location ~* /phpunit  { return 400; }
    location ~* /vendor   { return 400; }
    location ~* /wp\-     { return 400; }
    
    # разные запрещеные расширения 
    location ~* \.(php|html|htm|rsp|asp|py|key|conf|ini|sock|pem|crt)$ {
        # add_header local php always;
        # deny all;
        return 400;
    }

    # вот тут самое интересное. я обрабатываю статику и картинки
    location ~* \.(jpeg|jpg|png|gif|bmp|css|js)$ {
        root           $root_path;
        access_log     off;
        expires        max;
        try_files      $uri =404;  # почему если запрашиваю НЕ существующий файл он мне возвращает ошибку 400! хотя я же говорю давай 404
    }
    
    # перенаправление статических файлов работает исправно
    location ^~ /static {
       access_log     off;
       rewrite ^/static/(.*)$ /assets/$1 permanent;
    }

    # ?? вот  тут не понятно. папки такой все равно нет document_errors
    location /error/ {
        alias   /home/user/site/document_errors/;
    }

    # похоже не используется
    location @fallback {
        proxy_pass      http://1.1.1.1:8080;
    }

}

и я получаю картинку например по адресу

site.ru/images/img.jpg - картинка существует, отдает код ответа 200

но теперь если специально искажу имя и запрошу

site.ru/images/img123.jpg - картинка НЕ существует, код ответа 400

почему так происходит? ну и да на запросы вида

site.ru/.svn site.ru/.htaccess site.ru/any_file.php

ответ корректный - код ответа 400

почему try_files $uri =404; не отдает 404 код, а почему то 400. в чем дело

Конфиг немного упростил, но смысл оставил верный


Ответы (1 шт):

Автор решения: Alexey Ten

Директива error_page работает через внутренний редирект. В результате не найденная картинка приводит к тому, что nginx ищет адрес /error/404.html который в вашем конфиге попадает в

# разные запрещеные расширения 
location ~* \.(php|html|htm|rsp|asp|py|key|conf|ini|sock|pem|crt)$ {
    # add_header local php always;
    # deny all;
    return 400;
}

P.S. Отдельный вопрос зачем вам эти error_page если соответствующих файлов всё равно нет.

→ Ссылка