1

ここにどのように書いたかhttp://developer.yahoo.com/performance/rules.html

静的コンポーネントの場合: 遠い将来の Expires ヘッダーを設定して、「期限切れにならない」ポリシーを実装します。

「304」としての応答で http 要求を回避するパフォーマンスを得ることができます。
公式戦で!ドキュメンテーション cache-controll ディレクティブの設定方法を確認できますが、遠い将来の Expires ヘッダーを設定するにはどうすればよいですか?

よろしくニコラ


編集:リプレイをありがとう、それもうまくいくようになりました!ここにクラスがあります:

conf/ルート

  # Static files
  GET /assets/stylesheets/img/:name controllers.StaticFilesController.getBoostrapImg(name)
  GET /assets/images/*name          controllers.StaticFilesController.getImg(name)
  GET /assets/stylesheets/*name     controllers.StaticFilesController.getCss(name)
  GET /assets/javascripts/*name     controllers.StaticFilesController.getJs(name)


コントローラー/StaticFilesController.java

package controllers;
import org.apache.http.impl.cookie.DateUtils;
import java.util.*;
import play.mvc.*;
import services.FileName;
import play.*;
public class StaticFilesController extends Controller {

private static String nextYearString = StaticFilesController
        .getNextYearAsString();

public static Result getImg(String path) {

    FileName fileName = new FileName(path);
    response().setHeader(EXPIRES, nextYearString);
    response().setContentType("image/" + fileName.extension());
    return ok(Play.application().getFile("/public/images/" + path));
}

public static Result getBoostrapImg(String path) {

    FileName fileName = new FileName(path);
    response().setHeader(EXPIRES, nextYearString);
    response().setContentType("image/" + fileName.extension());
    return ok(Play.application().getFile(
            "/public/images/" + fileName.filename() + "."
                    + fileName.extension()));
}

public static Result getCss(String path) {

    response().setHeader(EXPIRES, nextYearString);
    response().setContentType("text/css");
    return ok(Play.application().getFile("/public/stylesheets/" + path));
}

public static Result getJs(String path) {

    response().setHeader(EXPIRES, nextYearString);
    response().setContentType("application/x-javascript");
    return ok(Play.application().getFile("/public/javascripts/" + path));
}

private static String getNextYearAsString() {
    Calendar calendar = new GregorianCalendar();
    calendar.add(Calendar.YEAR, 1);
    return DateUtils.formatDate(calendar.getTime());
}
}


サービス/ファイル名.java

package services;

/**
* This class assumes that the string used to initialize fullPath has a
* directory path, filename, and extension. The methods won't work if it
* doesn't.
*/
public class FileName {
private String fullPath;
private char pathSeparator, extensionSeparator;

public FileName(String str, char sep, char ext) {
 fullPath = str;
 pathSeparator = sep;
 extensionSeparator = ext;
}

public FileName(String str)
{
  fullPath = str;
  pathSeparator = '/';
  extensionSeparator = '.';
}

public String extension() {
  int dot = fullPath.lastIndexOf(extensionSeparator);
  return fullPath.substring(dot + 1);
 }

 public String filename() { // gets filename without extension
 int dot = fullPath.lastIndexOf(extensionSeparator);
 int sep = fullPath.lastIndexOf(pathSeparator);
  return fullPath.substring(sep + 1, dot);
}

 public String path() {
  int sep = fullPath.lastIndexOf(pathSeparator);
   return fullPath.substring(0, sep);
  }
 }


そして、views/main.scala.html

 @(skin: String)(content: Html)

 <!DOCTYPE html>

 <html lang="en">
   <head>
     <meta charset="utf-8"> 
     <title>LibreTitan</title>
      <link rel="stylesheet" media="screen"    href="@routes.StaticFilesController.getCss("bootstrap/bootstrap.min.css")">
    @if(skin != null && !skin.equals("")) {
    <link rel="stylesheet" media="screen" href="@routes.StaticFilesController.getCss(skin+".min.css")">
    }
    <link rel="shortcut icon" type="image/png" href="@routes.StaticFilesController.getImg("favicon.png")">
    <script async src="@routes.StaticFilesController.getJs("jquery-1.9.0.min.js")"></script>
    <script async src="@routes.StaticFilesController.getJs("bootstrap.min.js")"></script>
</head>
<body>
    <div class="container">
        @content
     </div>
    </body>
 </html>

ここに画像の説明を入力

4

1 に答える 1

1

Never expireこのコンテキストでのポリシーはExpire、応答にヘッダーを追加する必要があることを意味します。たとえば、現在から10年後の日付です。Manipulating the responseドキュメントで説明されているように、Playで簡単に行うことができます。例:

public static Result index() {
    response().setHeader(EXPIRES, "Thu, 16 Feb 2023 20:00:00 GMT");
    return ok("<h1>Hello World!</h1>");
}

もちろん、代わりに有効期限を指定しStringて動的に計算する方法を使用する必要があります。これは、org.joda.time.DateTime(Playで利用可能)および次のような方法で実行できますplusYears(int years)。最も重要なのは、最終的にRFC 1123日付形式でフォーマットする必要があるということです。

編集、もちろん、さまざまな種類の結果を返すことができます-ドキュメント(「結果」セクション)で説明されているようにバイナリでも、利用可能なすべてのオプションをチェックして、次のAPIを調べるplay.mvc.Resultsことができます:ok(Content content)-ビューをレンダリングするときの典型的なok(java.io.File content)、、、ok(java.io.InputStream content)

一方で...

far future static contentsPlayをサービス(およびその他の静的な公開コンテンツ)に使用しないことを強くお勧めします。簡単に行うことができますが、前述のように、IMHOは、単一の画像、スクリプト、スタイルなどのすべてのリクエストを処理する必要があるため、Playのリソースを無駄に浪費します。

そのジョブ(nginx、lighttpd、Apache)またはさらに良い分散CDNに一般的な...HTTPサーバーを使用することを検討してください。その場合、アプリはディスク上のスタイルシートを検索する代わりに、ロジックの実行に関心を持つ可能性があります。

PS HTTPサーバーの代わりにPlayを使用している場合、/publicフォルダーから提供される新しい静的コンテンツを追加するには、アプリケーションを再起動する必要があることに注意してください。少なくとも、アプリケーションとは別の専用フォルダーにそれらを保持していることを確認してください。 、アプリケーションを停止せずにそれらを追加/削除/置換できます。

于 2013-02-15T23:10:22.713 に答える