如何在Symfony2中启用浏览器缓存资产(图像/JS/CSS)?

3
我正在开发一个使用了大量图片、JS和CSS文件的Symfony2应用程序。我希望浏览器能够积极缓存这些文件,这样大部分页面加载时就不需要重新请求这些资产。
默认情况下,浏览器会持续检查这些文件,并且服务器会响应304未修改状态。我该如何更改此设置,以便不必运行此请求?(我不介意它使用ETag或Expires或任何机制,只要大多数页面请求不需要为所有图像运行单独的请求即可。)
我已经在Google上搜索过很多信息,了解了如何在控制器中设置各种属性的$request对象,但是我想知道如何在没有PHP代码返回的情况下处理这些资源(例如图片)。

资产缓存是由您的网络服务器(Apache、IIS等)完成的。您使用的是哪种网络服务器? - griotteau
@griotteau:Web服务器是Apache。 - Timwi
2个回答

6
你必须将以下内容添加到你的 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),以便在更改某些资源时使缓存失效。


httpd.conf文件位于哪里?这是在Apache还是Symfony目录中? - Joseph Astrahan
顺便说一句,我把这个放在我的.htaccess文件里,它工作得很好。Symfony中的关键差异似乎是,ExpiresByType text/js "access 1 week" ExpiresByType application/javascript "access 1 week",而不是其他提及JavaScript的方式,例如ExpiresByType text/x-javascript "access plus 1 month" ExpiresByType text/javascript "access plus 1 month"。 - Joseph Astrahan
@JosephAstrahan httpd.conf 文件位于 /etc/apache2。在 Ubuntu 中使用 apache2.conf 文件。 - Keloo

1

这不是针对您的 Web 服务器,而是针对使用 nginx+symfony 的人的解决方案:

  1. 编辑 config.yml 以启用资产版本控制,如下所示:here
#app/config/config.yml
    framework:
        # ...
        assets:
            version: 'v2'

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

  1. 按照此处描述的方式编辑您的 nginx 配置:here
服务器 {
...
    location ~* ^.+\.(rss|atom|jpg|jpeg|gif|png|ico|rtf|js|css)$ {
        expires max;
    }
...
}

现在,您的所有资源都将拥有最长的过期时间。

如果您发布新版本并更改一些 .css 和 .js 文件,只需编辑版本名称,例如从 'v2' 更改为 'v3'。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接