web-dev-qa-db-ja.com

nginxから提供される静的コンテンツの有効期限ヘッダーを設定する

Nginxを使用して静的コンテンツを提供していますが、特定のルールを満たすすべてのファイルに期限ヘッダーを設定する方法はありますか?たとえば、拡張子が「.css」のすべてのファイルに期限ヘッダーを設定できますか?

101
Unkwntech

いくつかのファイル拡張子に加えて、より完全なキャッシュヘッダーを使用することを好みます。 「?」プレフィックスは「非キャプチャ」マークであり、nginxは$ 1を作成しません。不要な負荷を軽減します。

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
135
J. M. Becker
server {
    ...

    location ~* \.css$ {
       expires 30d;
    }
    ...
}

location ディレクティブ

expires ディレクティブ

22
Dave Cheney

承認された回答によってファイルが表示されなくなる理由についてコメントするのに十分な評判はありませんが、私はそれを理解し、手助けしたいと思います!

短縮版:

グローバルなセットがない場合は、画像のロケーションブロックにルートディレクトリが指定されていることを確認してください。

以下のロングバージョン:


まず第一に、このソリューションを実装する私の方法は本当に この答え に似ていて、ルールを記述します(受け入れられた答えのように):

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

ファイルにimg-cache.conf

次に、そのファイルをserver {...}ディレクティブ。

私のsites-availableフォルダにあるsomesite.comの例:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

そうすることで、実行している可能性のある複数のサイトにイメージキャッシングロケーションブロックを追加できます。


第二に、私は/ var/www /にpublic_htmlとして許可する2つのフォルダーが含まれているという状況があります-安全でトレーニングのため、サイトのサーバーディレクティブで特定のロケーションブロックを作成し、これらのフォルダーを単一化する必要があります。

そのため、グローバルルートディレクトリセットがありません。

したがって、画像の場所をブロックするとき、そこから画像を検索するためのルートディレクトリをブロックに提供していない可能性があります。

私の解決策はそれから:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}
19
amurrell

有効期限を最大に設定することもできます。ここに私がcssとjsに使用するディレクティブがあります。

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
9
Jauder Ho

前述のすべての解決策は、異なるパスに対して異なるエイリアスを持つ可能性を否定します。また、すべての異なるキャッシュの有効期限を1か所に収めるために、nginxマップを次のように使用する必要があります。

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  Epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offはキャッシングを無効にし、Epoch(UNIX Epochの場合)は常にリソースを再フェッチします。maxはブラウザーの最大値に日付を設定します。

〜image /は任意の画像タイプに一致します。

Nginxマップの詳細については、 http://nginx.org/en/docs/http/ngx_http_map_module.html を参照してください。

4
Pantura

すべての静的ファイルのホームとなる場所が1つある場合、このようなことで十分です...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

受け入れられた回答により、nginxは静的ファイルを見つけられませんでした。理由はよくわかりませんが、これは単純な代替手段です。

2
user161646