7

Railsアプリの静的アセットにexpiresヘッダーを設定するためにnginxを取得できないようです。

私のアプリはPhusionPassengerとnginxを使用してデプロイされています。

以下は私のnginx設定ファイルの関連セクションです

server {
        listen  80;
        server_name my.domain.tld;
        root /home/deploy/my.domain.tld/current/public;
        passenger_enabled on;
        access_log off;

        location ~* \.(ico|css|js|gif|jp?g|png)\?[0-9]+$ {
                expires max;
                break;
        }

        if (-f $document_root/system/maintenance.html) {
                rewrite ^(.*)$ /system/maintenance.html break;
        }
}

静的アセットの有効期限ヘッダーを設定しない理由がわかりません(例:/images/foo.png?123456)

それが乗客と関係があるのか​​、それとも私の場所の正規表現がそれをキャッチしていないのかわかりません

4

4 に答える 4

10

タイムスタンプをオプションにすることは悪い考えです。タイムスタンプが含まれていない場合expires max、ファイルを更新する方法がないため、設定が間違っています。

また、locationNginxのディレクティブはクエリ文字列を認識できないため、ここに投稿されたソリューションが「オプションの」タイムスタンプと一致することはありません。

適切な解決策(つまり、ファイルがタイムスタンプ付きで要求された場合にのみ最大期限を送信する解決策)は次のようになります。

location ~* \.(js|css|png|jpg)$ {
  if ($query_string ~ "^[0-9]+$") {
    expires max;
    break;
  }
}

タイムスタンプが指定されていない場合は、Nginxによって自動的に処理されるLast-Modifiedとに依存します。ETag

于 2010-08-25T23:15:18.013 に答える
5

だから私は解決策を見つけることになった。タイムスタンプが存在しない可能性を考慮していなかったため、正規表現は少しずれていました。

この正規表現は私のために働いた。

location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ {
于 2009-05-20T18:51:55.370 に答える
1

「break」ディレクティブを使用する必要はありませんが、access_logoffを使用します。便利になります:

  location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ {
      access_log off;
      expires max;
      add_header Cache-Control public;
  }

あなたはgithubで完全な設定ファイルを見ることができます:https ://gist.github.com/711913

于 2010-12-03T05:43:19.577 に答える
0

多分これは役立つでしょう:

location ~* ^.*\.(ico|css|js|gif|jp?g|png)\?[0-9]+$ {

Nginxが場所を評価する方法もお読みください。location正規表現よりも前に、静的リソースに一致する他の文字列が構成ファイルにないことを確認しますlocationか?

ところで、の代わりにtry_filesif (-f $document_root/...)を使用することを検討してください。

于 2009-05-16T20:52:12.103 に答える