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


96

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

回答:


126

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

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

7
それを追加した後、すべての静的ファイルが見つかりませんでした。
ユルゲンポール

@JackSpairow:それがいつも私にとってうまくいったので、なぜそれが起こったのか本当に説明できません。Nginxを実行していて、add_header提供モジュールがありませんか?この種のものは本当に範囲が限られています、あなたは別の減速が組み合わせで問題ではないと確信していますか?
JMベッカー

24
おそらく、別のブロックにrootセットを持つ静的ファイルの定義がありました。その場合、そのブロックにディレクティブを追加する必要があります。(これは2年遅れですが、将来の市民のために)
アラロン14

1
特に将来の検索者にとっては、元の投稿のかなり後に表示されることが多いため、明確に感謝しています。+1:P
JMベッカー

これを使用すると、wordpressのWebサイトが完全に台無しになります。cssと画像は表示されません。どこかに他の競合がありますか?
user1641443


17

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

短縮版:

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

以下の長いバージョン:


まず第一に、このソリューションを実装する私の方法は、この回答に非常に似ていて、ルールを書くところです(受け入れられた回答のように):

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

img-cache.confファイルに

そして、そのファイルをserver {...}ディレクティブに含めます。

私のサイトで利用可能なフォルダーにある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;
}

1
これを再利用可能にするための+1 .conf。の適切なフォルダはのnginx/1.14.0 (Ubuntu)よう/etc/nginx/snippets/です。
ヤンヴェルホーフェン

9

有効期限を最大に設定することもできます。以下は、cssとjsに使用するディレクティブです。

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

1
rootディレクティブはサーバー{}ブロックでのみ使用します。サブロケーションで使用すると、予期しない結果になります。休憩は必要ありません。どちらか、あなたはif {}ブロックにいないので
デイブチェイニー

あなたが正しいです。これをきれいにするのを忘れました。これを反映するように編集されました。
ジョーダーホー

4

前述のすべてのソリューションは、異なるパスに対して異なるエイリアスを持つ可能性を否定します。また、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エポックの場合)。リソースが常に再フェッチされmax、日付がブラウザーの最大値に設定されます。

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

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


if $sent_http_content_type"text/css;charset=UTF-8"上の式に失敗することに注意してください。
パチャンカ

2

すべての静的ファイルのホームとなる場所が1つある場合、次のようになります...

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

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


私はこれに投票し/staticましたが、エイリアスの最後(.../files例の直後)にフォルダー(場所に設定したものは何でも)を追加してください。
ミロJ.

-1

これは非常に古いスレッドなので、最新のすばらしいチュートリアルを見つけました。

おそらくあなたはそれをチェックアウトしたいでしょう

Ubuntu 16.04でNginxのヘッダーモジュールを使用してブラウザーキャッシュを実装する方法


1
一般に、リンクは変更または期限切れになる傾向があるため、記事へのリンクはここでコンテンツを含めずにしかめ面します。
-Unkwntech
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.