Динамическая обработка отсутствующей статики и её кеширование

Часто приходится наблюдать наличие 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;
    }
}

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *