Как реализовать кэширование браузера в Nginx?

Здравствуйте! Перевел облачный сервер на Nginx + PHP-FPM. Ранее все настройки были под Apache c настройками в .htaccess:
## EXPIRES CACHING ##
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault                          "access plus 1 month"
  ExpiresByType text/cache-manifest       "access plus 0 seconds"
  ExpiresByType text/html                 "access plus 0 seconds"
  ExpiresByType text/xml                  "access plus 0 seconds"
  ExpiresByType application/xml           "access plus 0 seconds"
  ExpiresByType application/json          "access plus 0 seconds"
  ExpiresByType application/pdf           "access plus 1 day"
  ExpiresByType application/rss+xml       "access plus 1 hour"
  ExpiresByType image/x-icon              "access plus 1 week" 
  ExpiresByType image/gif                 "access plus 1 month"
  ExpiresByType image/png                 "access plus 1 month"
  ExpiresByType image/jpg                 "access plus 1 month"
  ExpiresByType image/jpeg                "access plus 1 month"
  ExpiresByType video/ogg                 "access plus 1 month"
  ExpiresByType audio/ogg                 "access plus 1 month"
  ExpiresByType video/mp4                 "access plus 1 month"
  ExpiresByType video/webm                "access plus 1 month"
  ExpiresByType text/x-component          "access plus 1 month"
  ExpiresByType font/truetype             "access plus 1 month"
  ExpiresByType font/opentype             "access plus 1 month"
  ExpiresByType application/x-font-woff   "access plus 1 month"
  ExpiresByType image/svg+xml             "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
  ExpiresByType text/css                  "access plus 2 months"
  ExpiresByType application/javascript    "access plus 2 months"
  ExpiresByType text/javascript           "access plus 2 months"

  <IfModule mod_headers.c>
    Header append Cache-Control "public"
  </IfModule>

</IfModule>

Сейчас настройки Nginx:
server {
        listen 80;
        server_name example.com www.example.com;
        root /home/sites/example.com;
        index index.php;
        client_max_body_size 30M;
        location / {
                root /home/sites/example.com;
                if (!-e $request_filename) {
                        rewrite ^/(.*)$ /index.php?q=$1 last;
                }
        }
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(.*)$;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_ignore_client_abort on;
                fastcgi_param  SERVER_NAME $http_host;
        }

        location ~ /\.ht {
                deny  all;
        }
}

Не понимаю, как EXPIRES CACHING перенести в Nginx?
Нашел в интернете старые настройки далекого 2013-2015 г., но не понимаю это оно или нет и вообще актуальность этого:
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpeg|avi|zip|gz|bz2|rar|swf|ico|7z|doc|docx|map|ogg|otf|pdf|ttf|tif|txt|wav|webp|woff|woff2|xls|xlsx|xml)$ {
        try_files $uri @rewrite;
        access_log off;
	    expires 10d;
	    break;
    }
Александр
05 августа 2025, 23:51
modx.pro
244
0

Комментарии: 2

Николай Савин
06 августа 2025, 09:17
1
+1
То, что ты нашел в принципе актуально. Так и делают.
Попробуй вот такой конфиг

server {
    listen 80;
    server_name example.com www.example.com;
    root /home/sites/example.com;
    index index.php;
    client_max_body_size 30M;
    
    # Новый блок для статических файлов с кешированием
    location ~* \.(jpg|jpeg|gif|png|svg|ico|pdf|mp4|webm|ogg|mp3|wav|ttf|otf|woff|woff2|eot)$ {
        # Срок действия кеша в браузере (аналог Expires в Apache)
        expires 1M; # access plus 1 month
        
        # Заголовок для указания, что кеш публичный (аналог Header append Cache-Control "public")
        add_header Cache-Control "public";
    }

    # Отдельный блок для CSS, JS (у них у вас срок больше)
    location ~* \.(css|js)$ {
        expires 2M; # access plus 2 months
        add_header Cache-Control "public";
    }

    location / {
        root /home/sites/example.com;
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?q=$1 last;
        }
    }
    
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_ignore_client_abort on;
        fastcgi_param  SERVER_NAME $http_host;
    }

    # Правило для запрета доступа к файлам Apache
    location ~ /\.ht {
        deny  all;
    }
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2