如何在Symfony2中启用资源(images / JS / CSS)的浏览器缓存?

时间:2014-08-02 09:33:05

标签: symfony caching assets

我正在研究使用大量图像,JS和CSS文件的Symfony2应用程序。

我希望浏览器积极地缓存这些内容,以便大多数页面加载不会重新请求这些资产。

默认设置似乎是浏览器不断重新检查它们以及服务器使用304 Not Modified进行响应。如何更改此设置以便它甚至不运行此请求? (我不介意它是否使用ETag或Expires或任何机制,只要大多数页面请求不对所有图像运行单独的请求。)

我已经搜索过很多关于如何执行此操作的详细信息 for pages 您的控制器中有一个$request对象,您可以在其中设置各种属性。但是,我问的是如何执行 for assets (例如图片),这些不是由我的任何PHP代码返回。

2 个答案:

答案 0 :(得分:5)

您必须在httpd.conf文件中添加它:

ExpiresActive On
ExpiresByType image/gif "access 1 month"
ExpiresByType image/jpg "access 1 month"
ExpiresByType image/jpeg "access 1 month"
ExpiresByType image/png "access 1 month"
ExpiresByType text/css "access 1 month"
ExpiresByType text/js "access 1 week"
ExpiresByType application/javascript "access 1 week"

必须激活模块'mod_expires'

另外,不要忘记在配置文件中添加asset_version(请参阅http://symfony.com/doc/current/reference/configuration/framework.html#ref-framework-assets-version),以便在更改某些资产时使缓存无效

答案 1 :(得分:0)

不适合您的网络服务器,但对于使用nginx + symfony的人来说,解决方案是:

  1. 编辑config.yml以将资产版本控制为描述符here
  2. #app/config/config.yml
        framework:
            # ...
            assets:
                version: 'v2'
    

    其中'v2' - 是您的自定义资产版权名称。

    1. 按照描述here
    2. 编辑您的nginx配置
      server {
      ...
          location ~* ^.+\.(rss|atom|jpg|jpeg|gif|png|ico|rtf|js|css)$ {
              expires max;
          }
      ...
      }
      

      现在您的所有资产都有最长的有效期。

      如果您制作新版本并更改了一些.css和.js文件,只需编辑版本名称即可。从'v2'到'v3'。