Назад | Перейти на главную страницу

NGINX - Невозможно установить Cache-control для перенаправленных файлов .js (с псевдонимом + перезапись)

Я успешно настроил сервер nginx, который использует как псевдоним + перезапись, как в конфигурации ниже. Все работает, за исключением того, что файлы javascript не принудительно кешируются браузером.

Текущая рабочая конфигурация (без кеш-контроля)

server {
    listen       80;

    server_name  localhost;
    root /space1/www;
    index  index.html index.htm index.php;

    access_log /var/log/nginx/access.log debug;

    location / {
        server_tokens off;
        client_max_body_size 20m;
        client_body_buffer_size 128k;
    }

    location ~ /\. {
        access_log off;
        log_not_found off;
        deny all;
    }

    # builder
    location /builder {
        alias /space1/builder;

        # luoicongtrinh
        rewrite ^/builder/apps/luoicongtrinh/(css|images|js|fonts|lib|uploads)/(.+)$ /builder/apps/luoicongtrinh/public/$1/$2 last;
        rewrite ^/builder/apps/luoicongtrinh/admin/(css|images|js|fonts|lib|uploads)/(.+)$ /builder/apps/luoicongtrinh/public/$1/$2 last;
        rewrite ^/builder/apps/luoicongtrinh/admin/?(.*)$ /builder/apps/luoicongtrinh/admin/index.php?p=$1&$args last;

        fastcgi_split_path_info ^/builder/(.+\.php)(.*)$;
        include /etc/nginx/php_fastcgi;
    }

    # Default PHP support
    include /etc/nginx/php_fastcgi;
}

Я пытаюсь добавить следующий блок для принудительного кеширования в браузере статических файлов (например, http: //localhost/builder/apps/luoicongtrinh/admin/js/main.js), но это не работает.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
    try_files $uri =404;
}

Я также пробовал различные конфигурации, но все равно безуспешно.

Пожалуйста, посоветуйте мне, как это правильно настроить. Большое спасибо!!!

ОБНОВИТЬ: Я пробовал использовать блок «если», и это работает.

# builder
location /builder {
    alias /space1/builder;

    # cache control for static resources
    if ($uri ~* "/(css|images|js|fonts|lib|uploads)/") {
        expires 30d;
        add_header Pragma public;
        add_header Cache-Control "public";
    }

    # luoicongtrinh
    rewrite ^/builder/apps/luoicongtrinh/(css|images|js|fonts|lib|uploads)/(.+)$ /builder/apps/luoicongtrinh/public/$1/$2 last;
    rewrite ^/builder/apps/luoicongtrinh/admin/(css|images|js|fonts|lib|uploads)/(.+)$ /builder/apps/luoicongtrinh/public/$1/$2 last;
    rewrite ^/builder/apps/luoicongtrinh/admin/?(.*)$ /builder/apps/luoicongtrinh/admin/index.php?p=$1&$args last;

    fastcgi_split_path_info ^/builder/(.+\.php)(.*)$;
    include /etc/nginx/php_fastcgi;
}

Я читал, что использование «если» - это «зло». Вы знаете, как по-другому сформулировать вышеуказанный блок «если»?

add_header является частью стороннего модуля под названием «headers more», вам нужно либо собрать nginx из исходного кода, либо убедиться, что ваш репозиторий уже сделал это за вас.

Чтобы собрать nginx из исходников прочтите этот учебник, который я написал - это довольно быстро и просто.

Чтобы проверить, работает ли модуль, нужно запустить

nginx -V

Добавить посмотреть, есть ли это на выходе

--add-module=../headers-more-nginx-module-0.29

Другой способ - добавить простой add_header в основной блок местоположения. add_header также является хорошим инструментом для отладки.

Для справки, вот как я делаю сборку Nginx. Обратите внимание, что в приведенном выше руководстве есть более оптимизированная версия команды configure, но эта более совместима и, вероятно, более безопасна.

cd /home/ec2-user
mkdir nginx-build
cd nginx-build
service nginx stop
yum groupinstall "Development Tools"
yum install pcre-devel zlib-devel openssl-devel
wget http://nginx.org/download/nginx-1.9.11.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
wget https://github.com/openresty/headers-more-nginx-module/archive/v0.29.tar.gz
tar -xzf nginx-1.9.11.tar.gz
tar -xzf ngx_cache_purge-2.3.tar.gz
tar -xzf v0.29.tar.gz # headers-more
# Note that I have no idea what the next line does but it was in the official guide
PS_NGX_EXTRA_FLAGS="--with-cc=/opt/rh/devtoolset-2/root/usr/bin/gcc"
# Safe option, slower, lots of modules included
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --add-module=/tmp/ngx_cache_purge-2.3 --add-module=/tmp/headers-more-nginx-module-0.29 --with-http_realip_module --add-modeule=../ngx_pagespeed-release-1.9.32.10-beta
make && make install
make clean  (NB: optional)
service nginx start

Затем попробуйте такой блок для кеширования статических ресурсов. Обратите внимание, что там нет файлов try_files.

location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
  log_not_found off; access_log off;
  add_header Cache-Control "public, max-age=691200, s-maxage=691200";
  more_clear_headers "Pragma"; more_clear_headers "Expires";
}