Часто приходится наблюдать наличие nginx реврайтов, но при этом когда запрашиваешь какой то конкретный файл — nginx отдает стандартную свою 404 страницу вместо страницы 404 сайта.
Например — это отсутствующая статика — картинки, скрипты, текстовые файлы и т.д. В принципе не страшно, но всё же должна быть единая 404 у сайта.
Другой момент, когда мы хотим обработать динамически не существующую статику. заметил интересную особенность — nginx режет при этом установленные заголовки через expires max;
Причина в try_files который при проверке если файл не существует, то теряет и заголовок. Забавно, что теряется он не для всех файлов, а например для картинок не теряет, а для txt, xml расширений теряет.
В примере ниже вешаем необходимые заголовки на всю динамическую/статическую статику, а уже в обработчике, если этот роут будет = 404, то соответственно там у нас будет и http_response_code(404); и nginx тогда сам автоматически «потеряет» эти кеширующие заголовки.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
index index.php;
error_log off;
access_log off;
set_real_ip_from 0.0.0.0/0;
real_ip_recursive on;
real_ip_header X-Forwarded-For;
location ~ /\. {
deny all;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~* \.(jpg|jpeg|png|tiff|gif|webp|html|yml|ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|rss|atom|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|rtf|pdf|txt|js|css|bmp|pnm|pbm|ppm)$ {
expires max;
access_log off;
try_files $uri /index.php?$args&expires=max;
}
location ~* \.xml$ {
expires max;
access_log off;
try_files $uri /index.php?$args&expires=24h;
}
location ~ \.php$ {
if ($arg_expires) {
expires $arg_expires;
}
try_files $uri /index.php$is_args$args;
client_max_body_size 40M;
fastcgi_split_path_info ^((?U).+\.ph(?:p\d*|tml))(/?.+)$;
fastcgi_pass ${APP_CONTAINER_NAME}:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}