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 шт):
Директива 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 если соответствующих файлов всё равно нет.